使用Websocket.NET客户端Ping Websocket服务器



我正试图弄清楚如何发送ping/pong检测信号,以确保在.NET Core WPF应用程序中使用Websocket.NET客户端与Websocket服务器保持连接,所以我正在用这个Binance Websocket进行测试,它说

websocket服务器将每3分钟发送一个ping frame。如果websocket服务器在10分钟内没有收到来自连接的pong frame,则连接将断开。允许未经请求的pong frames

但是,当我尝试使用示例代码进行连接时,我根本不会从包含字符串ping的websocket接收到任何消息,并且如果至少订阅了一个流,则连接似乎永远不会失败。此外,发送未经请求的pong消息似乎总是抛出error 3: invalid JSON,然后断开连接。

ping/pong心跳是否由NuGet Package管理(尽管我在其源代码中没有找到任何提到pingpong的行(,或者根本不支持它们?如果是,那么我与Binance Websocket的连接是如何/为什么没有断开的

以下是我为WSClient类编写的示例代码,因此您可以尝试并确保即使在+15分钟后也不会断开连接:

更新:它由WebsocketClient内部处理,KeepAliveInterval实际上在每个间隔发送pong帧。不过,我想知道是否可以订阅一些事件来查看这些帧何时发送,这在处理严格的消息速率限制时可能很有用,因为在发送pong帧的同时发送最大数量的消息时不会意外断开连接。

using System;
using System.Net.WebSockets;
using Websocket.Client;
using Websocket.Client.Models;
using System.Threading.Tasks;
using System.Reactive.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
public class WSClient
{
private List<string> logs = new List<string>();
private WebsocketClient client;
private string wsUrl = "wss://stream.binance.com/ws";

public WSClient() { }
public async Task InitializeClient()
{
Uri uri = new Uri(wsUrl);
Func<ClientWebSocket> factory = new Func<ClientWebSocket>(() => {
ClientWebSocket wsClient = new ClientWebSocket
{
Options =
{
KeepAliveInterval = TimeSpan.FromSeconds(5) // interval to send pong frames             }
};
return wsClient;
});
client = new WebsocketClient(uri, factory);
client.Name = "WebsocketClient";
client.ReconnectTimeout = TimeSpan.FromSeconds(30);
client.ErrorReconnectTimeout = TimeSpan.FromSeconds(30);
client.ReconnectionHappened.Subscribe(OnReconnection);
client.DisconnectionHappened.Subscribe(OnDisconnect);
client.MessageReceived
.Where((ResponseMessage message) => message.MessageType == WebSocketMessageType.Text)
.Subscribe(OnMessage);
try
{
await client.StartOrFail();
}
catch (Exception ex)
{
logs.Add($"Error: { ex.Message }");
}
// Subscribing to a stream (btcusdt@aggTrade for example)
client.Send("{"method": "SUBSCRIBE","params":["btcusdt@aggTrade"],"id": 1}");
}
private void OnReconnection(ReconnectionInfo info)
{
logs.Add("Reconnected");
}
private void OnMessage(ResponseMessage message)
{
logs.Add(message.Text);
}
private void OnDisconnect(DisconnectionInfo info)
{
logs.Add("Diconnected");
}
}

我认为WebSocketClient在暗中处理乒乓协议。我相信你不必担心。

最新更新