【发布时间】:2021-01-03 03:13:01
【问题描述】:
我需要与旧的 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.Connected 在 while 循环之后再次调用该方法
-
此代码在 Windows 服务中,当 !client.Connected 返回 false 时,服务会重新启动。但在我的情况下 !client.Connected 总是正确的,我只是停止接收数据。
-
你确定你没有收到数据吗?您如何验证这一点?您的代码是否处理拆分为多个接收的消息?它是否在一个接收到的一组字节中处理两条消息等?
-
是的,在我建立连接后服务器会向我发送“OK”。我确实收到了一段时间的其他消息。正如您在代码中看到的,我有一个“ProcessMessage()”函数。
-
从 cmd.exe >Netstat -a 检查连接状态。服务器可能关闭了连接,连接是半开半关的。所以看看 Netstat 是否给出 TimeError。