您好,我目前正在我的基本站点上实现一个websocket组件。我正在运行用于提供html的.NET Core 3.1 HTTP侦听器,但实施websockets令我感到困惑。
我以前在C#中使用TCP进行过工作,并且了解了所有内容的流程,但是websocket对我来说是新事物。这是接受websockets的C#代码
[Route("/socket", "GET")]
public static async Task upgrade(HttpListenerContext c)
{
if (!c.Request.IsWebSocketRequest)
{
c.Response.StatusCode = 400;
c.Response.Close();
return;
}
try
{
var sock = (await c.AcceptWebSocketAsync(null)).WebSocket;
byte[] buff = new byte[1024];
var r = await sock.ReceiveAsync(buff, System.Threading.CancellationToken.None);
}
catch (Exception x)
{
Console.WriteLine($"Got exception: {x}");
}
//WebSocketHandler.AddSocket(sock);
}
我向此函数添加了var r = await sock.ReceiveAsync(buff, System.Threading.CancellationToken.None);
,因为最初我是在WebSocketHandler类中获取异常的,所以我将代码移至一个函数进行测试。
这是客户:
<script>
let socket = new WebSocket("ws://localhost:3000/socket");
socket.onopen = function (event) {
console.log("[ OPENED ] - Opened Websocket!");
};
socket.onclose = function (event) {
console.log("[ CLOSED ] - Socket closed");
};
socket.onerror = function (error) {
console.log("[ ERROR ] - Got websocket error:");
console.error(error);
};
socket.onmessage = function (event) {
// This function will be responsible for handling events
console.log("[ MESSAGE ] - Message received: ");
const content = JSON.parse(event.data);
console.log(content);
};
</script>
这是客户端在控制台中的输出:
Navigated to http://127.0.0.1:5500/index.html
index.html:556 [ OPENED ] - Opened Websocket!
index.html:569 [ CLOSED ] - Socket closed
这是C#服务器的例外情况:
Got exception: System.Net.WebSockets.WebSocketException (997): The remote party closed the WebSocket connection without completing the close handshake.
at System.Net.WebSockets.WebSocketBase.WebSocketOperation.Process(Nullable`1 buffer, CancellationToken cancellationToken)
at System.Net.WebSockets.WebSocketBase.ReceiveAsyncCore(ArraySegment`1 buffer, CancellationToken cancellationToken)
at SwissbotCore.HTTP.Routes.UpgradeWebsocket.upgrade(HttpListenerContext c) in C:\Users\plynch\source\repos\SwissbotCore\SwissbotCore\HTTP\Routes\UpgradeWebsocket.cs:line 29
如果需要,我可以提供客户端发送的http请求,但是我对此深感困惑,将不胜感激。
答案 0 :(得分:0)
您可能想阅读Section 1.4 in RFC 6455中的“关闭握手” ,还可以阅读Section 7.1.1 in RFC 6455中的关闭WebSocket连接。
本质上,您需要在终止套接字之前让WebSocket终结点知道要关闭套接字。
对于您的服务器端,您可能应该捕获此异常,因为在生产环境中出现网络问题时也可能发生这种情况。
答案 1 :(得分:-1)
我不知道为什么,但是,如果您将 try 块中的代码更改为:
try
{
var sock = (await c.AcceptWebSocketAsync(null)).WebSocket;
byte[] buff = new byte[1024];
await Listen(sock);
}
catch (Exception x)
{
Console.WriteLine($"Got exception: {x}");
}
private async Task Listen(WebSocket sock)
{
return new Task(async () =>
{
while(sock.State == WebSocketState.Open)
{
var r = await sock.ReceiveAsync(buff, System.Threading.CancellationToken.None);
}
});
}
一切都会好的。