背景:外部因素迫使我在C#中实现一个简单的websocket客户端,并且我想保持低的第三方依赖关系的数量。所以如果可能的话,坚持使用System.Net.WebSockets会很好。ClientWebSocket确保消息已经发送并且连接还活着
目标:将一系列JSON对象作为单个消息发送到WebSocket服务器。如果发送失败并发生任何合理的超时,则抛出异常。如果基础TCP连接在新对象变为可用之间断开,则抛出异常。
发送代码:
// ws is an instance of System.Net.WebSockets.ClientWebSocket
ArraySegment<byte> json = new ArraySegment<byte>
Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data)));
if (!ws.SendAsync(json, WebSocketMessageType.Binary, true,
CancellationToken.None).Wait(10000))
{
throw new Exception("Error: Websocket send timeout");
}
Console.Write("Sent")
我这段代码的问题是,当我看到客户端程序打印“已发送”,服务器将不会收到消息,直到SendAsync的几个调用。我的印象是,它滞留在某种内部消息缓冲区中,直到缓冲区溢出。
同样,打破底层TCP连接不会导致下一个SendAsync引发异常,直到以后几条消息。
检查websocket是否存活而不发送: keepalive设置为默认值30s。然而,我从来没有见过wsState会返回除WebSocketState.Open以外的任何内容,即使在断开服务器之后几分钟内,如果我没有任何消息要发送。
我对ClientWebSocket应该如何使用,它根本不起作用,或者我错过文档中的某些细节感到困惑?
你应该使用原始套接字或WebSockets的?如果您使用的是websocket,那么.NET websocket会处理超时,失败和断开的连接。听起来这可能是服务器端的问题。 –
我在服务器上也使用websockets。我不认为这是服务器端问题,但我需要再次验证在排除该选项之前未检测到拔下网线。 – MaVo159