C#Android手机与TCP服务器的连接,被远程主机强制关闭

时间:2019-06-20 09:07:51

标签: c# server tcpclient tcplistener

我正在开发一种服务器,该服务器旨在接受android手机发送的响应,然后处理结果,但是我仍然遇到一个持久性问题:“现有连接已被远程主机强行关闭”

奇怪的是,我有一个运行正常的聊天应用程序(服务器/客户端)。与此实例之间的唯一区别是,Android手机连接到无线访问点并以无线方式发送数据,而聊天应用程序是有线的。

我的代码在这里:

服务器:

    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);
            }
        }
    }

关于同一主题还有其他问题,但是我的情况略有不同,更加专业。上面的代码是直接从我一年前创建的服务器/客户端中复制的,它也是一个android应用程序,工作正常。这就是为什么代码无法正常工作如此令人惊讶的原因。

它似乎有时也起作用,有时不起作用。因此,通过进行较小的更改(例如在客户端连接后添加延迟)将使服务器工作一会儿,但最终它将停止工作。可能有一天无法正常工作,但第二天会完美运行。

我有Wireshark,但不确定如何解释数据包。您可以在此处看到它们,192.168.0.52是android手机的IP,而pc021是服务器正在运行的设备。

enter image description here

我尝试了此处发布的所有其他解决方案后,将能提供任何帮助,但除错误消息相同外,它们似乎与我的问题无关。

1 个答案:

答案 0 :(得分:1)

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

到目前为止,它已经运行了3天,没有问题,而以前它会在扫描10-20分钟后崩溃。