C# android phone 到 tcp 服务器,连接被远程主机强行关闭

C# android phone to tcp server, connection forcibly closed by remote host

我正在开发一个服务器,旨在接受 android phone 发送的响应,然后处理结果,但是我一直遇到一个持续存在的问题 "An existing connection was forcibly closed by the remote host"

奇怪的是,我的聊天应用程序 (server/client) 运行良好。该实例与此实例之间的唯一区别是 android phone 连接到无线接入点并以无线方式发送数据,而聊天应用程序是有线的。

我的代码在这里:

服务器:

    private static void StartServer()
    {
        TcpListener listener = new TcpListener(IPAddress.Parse(SERVER_IP), PORT_NO);
        listener.Start();
        while (true)
        {
            using (TcpClient client = listener.AcceptTcpClient())
            {
                using (NetworkStream stream = client.GetStream())
                {
                    byte[] buffer = new byte[client.ReceiveBufferSize];
                    int bytesRead = stream.Read(buffer, 0, client.ReceiveBufferSize);
                    string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
                    Console.WriteLine($"Received: {dataReceived}");
                    Thread staThread = new Thread(() => PasteText(dataReceived));
                    staThread.SetApartmentState(ApartmentState.STA);
                    staThread.Start();
                }
            }
        }
    }

客户:

    private void SendToServer(string resultToSend)
    {
        using (TcpClient client = new TcpClient(SERVER_IP, PORT_NO))
        {
            using (NetworkStream stream = client.GetStream())
            {
                byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(resultToSend);
                stream.Write(bytesToSend, 0, bytesToSend.Length);
            }
        }
    }

同一主题还有其他问题,但我的情况有点不同,而且更专业。上面的代码是直接从我一年前创建的 server/client 复制而来的,它也是一个 android 应用程序,并且运行没有问题。这就是为什么代码不再正常工作令人惊讶的原因。

它也似乎偶尔有效,偶尔无效。所以通过做一个小的改变(比如在客户端连接后添加延迟)会让服务器工作一段时间,但最终它会停止工作。它可能有一天不起作用,但第二天它会完美地工作。

我有 wireshark,但我不确定如何解释数据包。你可以在这里看到它们,192.168.0.52 是 android phone 的 ip,pc021 是服务器所在的设备 运行。

任何帮助将不胜感激,因为我已经尝试了此处发布的所有其他解决方案,但它们似乎与我的问题无关,只是错误消息相同。

找到了一个潜在的解决方案,至少我没有像以前那样经历过任何强制关闭。解决方案是通过添加以下行在 TCP 服务器上启用 TLS1.2:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

到目前为止,它已经连续 3 天正常运行,而之前它会在扫描 10-20 分钟后崩溃。