持续接收 TcpClient
Constant Recieve 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 分钟后我停止从服务器接收。感谢您的帮助。
尝试用 try catch 包围您的代码,以便您可以查看是否有异常。
另一件事不要使用 client.connected 因为它只会在您第一次连接时更改他的状态,而不是在客户端断开连接时更改,因此您的循环条件将始终为真。
试试这个(只需将您的阅读代码放入循环中):
// Incoming message may be larger than the buffer size.
do{
numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
}
while(myNetworkStream.DataAvailable);
我看到了,但连接上并不意味着你总是有数据可读。您没有任何条件来验证是否有可用数据可供读取。至少在你的循环中放一个 if 语句来检查数据的可用性。
看来我的轮询机制没有保持连接。
首先我在套接字上尝试了这个设置。
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
之后,我的轮询机制开始检测连接在一段时间后断开,但这只会使连接保持活动状态 2 小时。
然后我偶然发现这篇文章似乎可以解决问题。 https://darchuk.net/2019/01/04/c-setting-socket-keep-alive/
我需要与旧 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 分钟后我停止从服务器接收。感谢您的帮助。
尝试用 try catch 包围您的代码,以便您可以查看是否有异常。 另一件事不要使用 client.connected 因为它只会在您第一次连接时更改他的状态,而不是在客户端断开连接时更改,因此您的循环条件将始终为真。
试试这个(只需将您的阅读代码放入循环中):
// Incoming message may be larger than the buffer size.
do{
numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
}
while(myNetworkStream.DataAvailable);
我看到了,但连接上并不意味着你总是有数据可读。您没有任何条件来验证是否有可用数据可供读取。至少在你的循环中放一个 if 语句来检查数据的可用性。
看来我的轮询机制没有保持连接。
首先我在套接字上尝试了这个设置。
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
之后,我的轮询机制开始检测连接在一段时间后断开,但这只会使连接保持活动状态 2 小时。
然后我偶然发现这篇文章似乎可以解决问题。 https://darchuk.net/2019/01/04/c-setting-socket-keep-alive/