c# - 不断接收 TcpClient
问题描述
我需要与旧的 Java TCP 服务器通信。它的工作方式是我需要通过发送请求来建立连接,在请求之后我订阅了事件并且服务器通过连接向我发送数据,所以我需要一直监听数据。这就是我所拥有的,它可以工作一段时间,但一段时间后它会停止接收。
string logon = GetLogon();
client = new TcpClient(SERVER_IP, PORT_NO);
NetworkStream nwStream = client.GetStream();
byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(logon);
nwStream.Write(bytesToSend, 0, bytesToSend.Length);
while (client.Connected)
{
byte[] bytesToRead = new byte[client.ReceiveBufferSize];
int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);
var message = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);
this.ProcessMessage(message);
}
我每分钟在一个单独的函数中轮询服务器以检查连接是否打开,即使我没有得到任何数据,它也总是如此。
bool poll = client.Client.Poll(1000, SelectMode.SelectRead);
bool data = (client.Client.Available == 0);
这可行,但大约 20 到 60 分钟后,我停止从服务器接收。谢谢您的帮助。
解决方案
看来我的轮询机制没有保持连接有效。
首先,我在套接字上尝试了此设置。
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
之后,我的轮询机制开始检测到连接在一段时间后断开,但这只能使连接保持 2 小时。
然后我偶然发现了这篇文章,它似乎可以解决问题。https://darchuk.net/2019/01/04/c-setting-socket-keep-alive/
推荐阅读
- php - 为什么 Composer 安装突然失败?
- javascript - 为什么 concat 添加到不可变数组不起作用?
- python - SQLAlchemy 选择混合属性表达式作为列
- node.js - Discord.js-commando 从 id 获取用户名
- java - postgres:插入自定义类型的数组
- erlang - Ejabberd 20.0.2 管理面板登录表单反弹
- push-notification - RingCentral Glip 的通知
- angular - Angular 8-双向数据绑定,空值
- winapi - MessageBoxW 是否使用 NULL hWnd 调用 GetMessageW?
- docker - Docker Chrome 崩溃:OpenQA.Selenium.WebDriverException:未知错误:Chrome 无法启动:崩溃。(铬无法访问)