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 分钟后崩溃。
我正在开发一个服务器,旨在接受 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 分钟后崩溃。