首页 > 解决方案 > 不断接收 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 分钟后,我停止从服务器接收。谢谢您的帮助。

标签: c#.nettcp

解决方案


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

首先,我在套接字上尝试了此设置。

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

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

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


推荐阅读