如何解决持续接收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,bytesToSend.Length);
while (client.Connected)
{
byte[] bytesToRead = new byte[client.ReceiveBufferSize];
int bytesRead = nwStream.Read(bytesToRead,client.ReceiveBufferSize);
var message = Encoding.ASCII.GetString(bytesToRead,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/
,尝试用try catch包围代码,以便查看是否有异常。 另一件事不要使用client.connected,因为它只会在您第一次连接时更改其状态,而不会在客户端断开连接时更改其状态,因此您的循环条件将始终为真。
试试看(只需将您的阅读代码放入循环中):
// Incoming message may be larger than the buffer size.
do{
numberOfBytesRead = myNetworkStream.Read(myReadBuffer,myReadBuffer.Length);
myCompleteMessage.AppendFormat("{0}",Encoding.ASCII.GetString(myReadBuffer,numberOfBytesRead));
}
while(myNetworkStream.DataAvailable);
MSDN NetworkStream.DataAvailable FULL EXAMPLE
,我看到了,但是连接并不意味着您总是有数据要读取。您没有任何条件可以验证是否有可读取的数据。至少在循环中放入一个if语句,以检查数据的可用性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。