持续接收 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);

MSDN NetworkStream.DataAvailable FULL EXAMPLE

我看到了,但连接上并不意味着你总是有数据可读。您没有任何条件来验证是否有可用数据可供读取。至少在你的循环中放一个 if 语句来检查数据的可用性。

看来我的轮询机制没有保持连接。

首先我在套接字上尝试了这个设置。

client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

之后,我的轮询机制开始检测连接在一段时间后断开,但这只会使连接保持活动状态 2 小时。

然后我偶然发现这篇文章似乎可以解决问题。 https://darchuk.net/2019/01/04/c-setting-socket-keep-alive/