Ars*_*han 9 c# visual-studio websocket xamarin
我有一个使用 WebSocket 进行通信的 Xamarin 应用程序。在客户端,我引用了ClientWebSocket.
代码:
using (var client = new ClientWebSocket() { Options = { KeepAliveInterval = new TimeSpan(0,0,3,0) }})
{
try
{
await client.ConnectAsync(requestUri, cancellationToken);
do
{
WebSocketReceiveResult result = null;
var buffer = new byte[ReceiveChunkSize];
var message = new ArraySegment<byte>(buffer);
do
{
result = await client.ReceiveAsync(message, cancellationToken);
var receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
data.Append(receivedMessage);
if (result.MessageType != WebSocketMessageType.Text)
break;
} while (!result.EndOfMessage);
TranslateData(data);
} while (client.State == WebSocketState.Open && !cancellationToken.IsCancellationRequested);
Run Code Online (Sandbox Code Playgroud)
应用程序断断续续地抛出:
System.Net.WebSockets.WebSocketException (0x80004005): The remote
party closed the WebSocket connection without completing the close
handshake.
Run Code Online (Sandbox Code Playgroud)
服务器有一个测试网站,它似乎按预期运行。看来问题出在客户端上。在该值client.State是Open。
如果有人仍然像我一样发现这个问题......
我有同样的问题,我添加了这个检查
result = await client.ReceiveAsync(message, cancellationToken);
if (result.Count == 0) {
break;
}
Run Code Online (Sandbox Code Playgroud)
以某种方式获取零字节也意味着服务器终止了连接或出现了问题......
我在 WebSocket 周围添加了一个计时器来对连接进行 ping -> pong 类型检查。当然,这只有在您也控制服务器端代码的情况下才有可能。在服务器端,这可以帮助您检测死连接。
对我有帮助的链接是:
https://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html
并且 - 就像 aleha_84 所写的那样。循环中的异常也应该触发重新连接。
| 归档时间: |
|
| 查看次数: |
8676 次 |
| 最近记录: |