Сценарий
- Сервер на основе C #
- Клиент на основе JavaScript
Ситуация
Я создал этот довольно простой "сервер", которыйединственная задача - помочь мне понять, как на самом деле использовать эти веб-сокеты в среде C #.
using (var server = new HttpListener())
{
server.Prefixes.Add("http://localhost:8080/");
server.Start();
while(true)
{
var context = server.GetContext();
if (context.Request.IsWebSocketRequest)
{
var cntxt = context.AcceptWebSocketAsync(null).ConfigureAwait(true).GetAwaiter().GetResult();
var buff = new byte[2048];
while(cntxt.WebSocket.State == System.Net.WebSockets.WebSocketState.Open || cntxt.WebSocket.State == System.Net.WebSockets.WebSocketState.Connecting)
{
cntxt.WebSocket.ReceiveAsync(new ArraySegment<byte>(buff), CancellationToken.None).ConfigureAwait(true).GetAwaiter().GetResult();
Console.WriteLine(Encoding.UTF8.GetString(buff));
}
}
else
{
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
using (var writer = new StreamWriter(context.Response.OutputStream))
{
writer.Write("<html><body>WEBSOCKET ONLY!</body></html>");
}
}
}
}
Проблема теперь заключается в следующем: когда я пытаюсь добавить префикс веб-сокета с помощью server.Prefixes.Add("ws://localhost:8080")
, я получаю System.ArgumentException
брошенный, который говорит, что я могу только добавить http
и https
в качестве принятого протокола.
Дело в том, что, делая это и используя ws = new WebSocket('ws://localhost:8080');
(JavaScript) для подключения к веб-сокету, по понятным причинам ничего не получится,Изменение префикса на HTTP в веб-сокете JS предоставит мне еще одно исключение аргумента сортировки.
Актуальный вопрос
Как на самом деле заставить HttpListener принимать запросы веб-сокетов?
Дополнительная информация
Используется .net
Framework - 4.6.1 Браузер, чтобы проверить это был Google Chrome 69.0.3497.100