我们有 2 个 UWP 应用程序。一个应用通过 StreamSocket 与另一个应用共享数据。服务器应用程序将数据发送到客户端应用程序。将有 30-40 台或更多设备运行客户端应用程序并连接到服务器的套接字以接收数据。
当我们使用一个客户端应用程序进行测试时,所有数据共享都会毫无问题地发生。但是当我们开始使用客户端应用程序对大约 10 台设备进行测试时,有时某些应用程序无法接收数据。并且似乎有一个错误说A connection attempt failed because the connected party did a time after a period没有正确响应,或建立连接失败,因为已连接的主机没有响应
一般来说,它会与大多数设备共享,但有时会随机失败。这可能是什么原因?使用 Stream Socket 连接到具有给定 IP 和端口的套接字是否存在连接限制?
这是我们代码的一些部分。请让我知道我们必须在此处更正什么以避免出现该错误。
服务器端
public async Task StartServer(string serverIp, string serverPort)
{
try
{
HostName serverAddress = new HostName(serverIp);
//Create a StreamSocketListener to start listening for TCP connections.
StreamSocketListener socketListener = new StreamSocketListener();
//Hook up an event handler to call when connections are received.
socketListener.ConnectionReceived += SocketListener_ConnectionReceived;
//Start listening for incoming TCP connections on the specified port.
await socketListener.BindEndpointAsync(serverAddress, serverPort);
}
catch (Exception e)
{
}
}
private async void SocketListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
try
{
await Task.Run(() => ShareFile(args.Socket));
}
catch (Exception e)
{
}
}
客户端
public async Task ServerConnect(string serverIP, string serverPort)
{
try
{
HostName serverAddress = new HostName(serverIP);
StreamSocket socket = new StreamSocket();
socket.Control.KeepAlive = false;
// Connect to the server.
await socket.ConnectAsync(serverAddress, serverPort, SocketProtectionLevel.PlainSocket);
}
catch (Exception e)
{
}
}
也想澄清这些
- BindServiceNameAsync 和 BindEndpointAsync 有什么区别?大多数示例似乎使用第一个。我们什么时候应该使用第二个?
- 如果我们调用 sender.Dispose(); 在 SocketListener_ConnectionReceived 中,这会影响尝试加入同一个套接字的其他客户端吗?
-在ShareFile()函数中,如果我们在发送数据后关闭args.Socket(),它能否在客户端真正从那端读取数据之前关闭socket?