【发布时间】:2018-10-11 09:57:11
【问题描述】:
场景
- 基于 C# 的服务器
- 基于 JavaScript 的客户端
情况
我创建了这个相当简单的“服务器”,它唯一的工作就是帮助我了解如何在 C# 环境中实际使用这些 websocket。
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") 添加 websocket 前缀时,我得到一些 System.ArgumentException 抛出,这告诉我我只能添加 http 和 https 作为接受的协议。
事情是:这样做并使用ws = new WebSocket('ws://localhost:8080'); (JavaScript) 连接到 websocket,显然没有任何结果。
在 JS websocket 中将前缀更改为 HTTP,将为我提供另一个排序参数异常。
实际问题
如何真正让 HttpListener 接受网络套接字请求?
更多信息
使用.net 框架是4.6.1
用于测试的浏览器是 Google Chrome 69.0.3497.100
【问题讨论】:
标签: javascript c# websocket