|
現在利用してはいないのですが、以前提案したものに近いものとして
jsmode "WebView2"の WebSocketがあります。
fetchが封じされているのに、WebSocketは生き残っているようで、
これこのまま残るのかな? と疑問に思いました。
(jsmode側のfetchもlocalhost対象だと実行できるようにするのかな?)
----- test.mac ------
jsmode "WebView2";
js {
debuginfo(2);
let connection = new WebSocket("ws://localhost:12345");
connection.onopen = function(event) {
console.log("通信接続イベント受信");
console.log(event.data);
}
//エラー発生
connection.onerror = function(error) {
console.log("エラー発生イベント受信");
console.log(error.data);
};
//メッセージ受信
connection.onmessage = function(event) {
console.log("メッセージ受信");
console.log(event.data);
};
//切断
connection.onclose = function() {
console.log("通信切断イベント受信");
};
}
----------- test.cs (ConsoleApp6.exe) -------------------
using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp6
{
internal class Program
{
static async Task Run()
{
//Httpリスナーを立ち上げ、クライアントからの接続を待つ
HttpListener s = new HttpListener();
s.Prefixes.Add("http://localhost:12345/");
s.Start();
var hc = await s.GetContextAsync();
//クライアントからのリクエストがWebSocketでない場合は処理を中断
if (!hc.Request.IsWebSocketRequest)
{
//クライアント側にエラー(400)を返却し接続を閉じる
hc.Response.StatusCode = 400;
hc.Response.Close();
return;
}
//WebSocketでレスポンスを返却
var wsc = await hc.AcceptWebSocketAsync(null);
var ws = wsc.WebSocket;
//10回のレスポンスを返却
for (int i = 0; i != 10; ++i)
{
//1回のレスポンスごとに2秒のウエイトを設定
await Task.Delay(2000);
//レスポンスのテストメッセージとして、現在時刻の文字列を取得
var time = DateTime.Now.ToLongTimeString();
//文字列をByte型に変換
var buffer = Encoding.UTF8.GetBytes(time);
var segment = new ArraySegment<byte>(buffer);
//クライアント側に文字列を送信
await ws.SendAsync(segment, WebSocketMessageType.Text,
true, CancellationToken.None);
}
//接続を閉じる
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure,
"Done", CancellationToken.None);
}
static async Task Main(string[] args)
{
await Run();
}
}
}
|
|