背景:外部因素迫使我在C#中实现一个简单的websocket客户端,我希望保持第三方依赖的数量较少。因此,如果可能的话,坚持使用System.Net.WebSockets会很好。
目标:将一系列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")
我对此代码的问题是,当我看到客户端程序打印&#34;已发送&#34;时,在多次调用SendAsync之前,服务器将不会收到该消息。我的印象是,它会被卡在某种内部消息缓冲区中,直到缓冲区溢出。
同样,打破底层TCP连接不会导致下一个SendAsync在稍后的几条消息之前抛出异常。
检查websocket是否处于活动状态而不发送: keepalive设置为默认值30s。然而,我从未见过ws.State返回除了WebSocketState.Open以外的任何内容,即使在断开服务器之后几分钟,如果我没有任何消息要在其间发送。
我是否从根本上混淆了如何使用ClientWebSocket,它是不起作用,还是我错过了文档中的一些细节?
答案 0 :(得分:1)
您应 forskningsresultater_id id participant user_id
0 NaN 338884 True NaN
1 NaN 566233 True NaN
2 NaN 636223 True NaN
3 NaN 754756 True NaN
4 NaN 802856 True NaN
5 NaN 1005256 True NaN
...
中的await
async方法:
Task.Run