gpt4 book ai didi

c# - 一段时间后 Websocket 停止响应

转载 作者:行者123 更新时间:2023-11-30 23:02:19 26 4
gpt4 key购买 nike

我有一个 Windows 服务,它使用 websocket(来自 http://sta.github.io/websocket-sharp/)连接到 Slack 并监控消息。

我的连接代码看起来像这样:

ws = new WebSocket(connection.Url);

ws.OnMessage += async (sender, e) =>
{
var msg = JsonConvert.DeserializeObject<MessageFromSlack>(e.Data);
if (msg.Type == "message" && msg.Text != null && msg.User != UserId)
{
if (userMatcher.IsMatch(msg.Text))
{
await ProcessDirectMessage(msg);
}
await ProcessMessage(msg);
}
if (msg.Type == "channel_joined")
{
await ChannelJoined(msg.ChannelModel.Id);
}
};

ws.OnClose += (sender, e) =>
{
var reason = e.Reason;
var code = e.Code;
System.Diagnostics.Debug.WriteLine($"{code}:{reason}");
};

ws.Connect();

基本上它会等待一条消息,然后如果它是针对我的机器人的,它会调用 ProcessDirectMessage,如果不是,它会调用 ProcessMessage。我认为这些功能的细节并不重要(它们会进行一些匹配以查找关键短语并通过发回消息进行响应)。

一切正常。一阵子。但是一段时间后(通常超过一天),它就会完全停止响应。我的 OnMessage 处理程序永远不会被命中。我认为可能发生的事情是 websocket 在服务器端关闭,所以我添加了 OnClose 处理程序,但似乎也没有受到影响。

有人知道这里会发生什么吗?有没有办法让连接保持事件状态,或者在它死亡时重新连接?

最佳答案

根据 TCP 连接的性质 - 检测它消失的唯一可靠方法是向它写入一些内容。如果你只是在阅读(等待数据到达)——你可以这样做很长时间,而另一方已经死了很长时间。如果另一方没有正常关闭连接(这涉及一些 TCP 数据包的交换),就会发生这种情况。

Web socket 协议(protocol)定义了特殊的Ping 帧和相应的Pong 帧,您应该使用它来避免问题中描述的情况。有时您应该发送 Ping 帧并等待(特定超时)服务器响应 Pong 帧。如果它在给定的超时时间内没有响应 - 假设连接已断开并重新连接。

据我所知 - 您使用的库不会自动代表您发送 ping 请求。但是,它允许您通过 Ping 方法执行此操作。

你需要配置超时

ws.WaitTime = TimeSpan.FromSeconds(5);

然后,时不时地(例如 - 当您在过去 X 秒内没有收到任何新消息时),执行以下操作:

bool isAlive = ws.Ping();

还有一个 bool 属性做同样的事情:

bool isAlive = ws.IsAlive;

这是一个阻塞调用(以上两者)。如果服务器在 ws.WaitTime 间隔期间用 Pong 回复,它将返回 true,否则返回 false。然后您可以采取相应的行动。

关于c# - 一段时间后 Websocket 停止响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50530504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com