在来自客户端 [Windows 10 通用应用程序,C#,XAML] 的几个请求后,TCP 服务器停止响应
TCP server stops responding after a few requests from client [Windows 10 Universal app, C#, XAML]
我试图制作一个小的 UWP 纸牌游戏来学习如何使用 TCP,但是我的服务器总是在几次连接后停止响应客户端。
客户端向服务器发送不同的消息,如"DrawCard;(name of card)"。有趣的是,前 30-40 条消息总是毫无问题地到达服务器,但是 在 某些类型的消息之后,服务器就停止接受任何新消息:例如,我可以抽尽可能多的牌随我喜欢,但是当我播放一个时,服务器停止监听。
我已经尝试解决这个问题几个小时了,所以我希望有人能帮助我。
当应用程序启动时,调用此函数:
public async static Task StartListening()
{
Windows.Networking.Sockets.StreamSocketListener socketListener = new Windows.Networking.Sockets.StreamSocketListener();
socketListener.ConnectionReceived += SocketListener_ConnectionReceived;
await socketListener.BindServiceNameAsync("1337");
//If I leave this line out, it doesn´t even start listening for connections. Any idea why?
await System.Threading.Tasks.Task.Delay(500);
}
这是在收到连接时触发的事件:
public async static void SocketListener_ConnectionReceived(Windows.Networking.Sockets.StreamSocketListener sender,
Windows.Networking.Sockets.StreamSocketListenerConnectionReceivedEventArgs args)
{
Stream inStream = args.Socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(inStream);
string request = await reader.ReadLineAsync();
HandleData(request);
////Send the line back to the remote client.
Stream outStream = args.Socket.OutputStream.AsStreamForWrite();
StreamWriter writer = new StreamWriter(outStream);
await writer.WriteLineAsync(request);
}
HandleData() 使用
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
/...
});
编辑一些绑定到 UI 个元素的 ObservableCollection。
客户端代码为:
public async Task SendDataToServer(string data)
{
Windows.Networking.Sockets.StreamSocket socket = new Windows.Networking.Sockets.StreamSocket();
Windows.Networking.HostName serverHost = new Windows.Networking.HostName(hostname);
string serverPort = "1337";
await socket.ConnectAsync(serverHost, serverPort);
//Write data to the server.
Stream streamOut = socket.OutputStream.AsStreamForWrite();
StreamWriter writer = new StreamWriter(streamOut);
await writer.WriteLineAsync(data);
//Read data from the server.
Stream streamIn = socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(streamIn);
string response = await reader.ReadLineAsync();
}
}
在我的测试场景中,客户端应用程序在我的 Windows 移动设备 phone 上运行,服务器在我的 PC 上运行。除了返回接收到的消息以确保正确接收之外,PC 不会将任何数据发送回客户端。
非常感谢您提供的任何帮助。我已经尝试了在 Internet 上可以找到的所有内容,但没有找到适合我的内容。
非常感谢@Jay Zuo - MSFT!
我查看了官方示例,发现我错过了以下代码行:
CoreApplication.Properties.Add("listener", socketListener);
根据 MS 示例,此 "save[s] the socket, so subsequent steps can use it."
该应用程序现在按预期工作。非常感谢@Rafael 和@Jay Zuo - MSFT 的帮助!
我试图制作一个小的 UWP 纸牌游戏来学习如何使用 TCP,但是我的服务器总是在几次连接后停止响应客户端。
客户端向服务器发送不同的消息,如"DrawCard;(name of card)"。有趣的是,前 30-40 条消息总是毫无问题地到达服务器,但是 在 某些类型的消息之后,服务器就停止接受任何新消息:例如,我可以抽尽可能多的牌随我喜欢,但是当我播放一个时,服务器停止监听。
我已经尝试解决这个问题几个小时了,所以我希望有人能帮助我。
当应用程序启动时,调用此函数:
public async static Task StartListening()
{
Windows.Networking.Sockets.StreamSocketListener socketListener = new Windows.Networking.Sockets.StreamSocketListener();
socketListener.ConnectionReceived += SocketListener_ConnectionReceived;
await socketListener.BindServiceNameAsync("1337");
//If I leave this line out, it doesn´t even start listening for connections. Any idea why?
await System.Threading.Tasks.Task.Delay(500);
}
这是在收到连接时触发的事件:
public async static void SocketListener_ConnectionReceived(Windows.Networking.Sockets.StreamSocketListener sender,
Windows.Networking.Sockets.StreamSocketListenerConnectionReceivedEventArgs args)
{
Stream inStream = args.Socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(inStream);
string request = await reader.ReadLineAsync();
HandleData(request);
////Send the line back to the remote client.
Stream outStream = args.Socket.OutputStream.AsStreamForWrite();
StreamWriter writer = new StreamWriter(outStream);
await writer.WriteLineAsync(request);
}
HandleData() 使用
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
/...
});
编辑一些绑定到 UI 个元素的 ObservableCollection。
客户端代码为:
public async Task SendDataToServer(string data)
{
Windows.Networking.Sockets.StreamSocket socket = new Windows.Networking.Sockets.StreamSocket();
Windows.Networking.HostName serverHost = new Windows.Networking.HostName(hostname);
string serverPort = "1337";
await socket.ConnectAsync(serverHost, serverPort);
//Write data to the server.
Stream streamOut = socket.OutputStream.AsStreamForWrite();
StreamWriter writer = new StreamWriter(streamOut);
await writer.WriteLineAsync(data);
//Read data from the server.
Stream streamIn = socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(streamIn);
string response = await reader.ReadLineAsync();
}
}
在我的测试场景中,客户端应用程序在我的 Windows 移动设备 phone 上运行,服务器在我的 PC 上运行。除了返回接收到的消息以确保正确接收之外,PC 不会将任何数据发送回客户端。
非常感谢您提供的任何帮助。我已经尝试了在 Internet 上可以找到的所有内容,但没有找到适合我的内容。
非常感谢@Jay Zuo - MSFT! 我查看了官方示例,发现我错过了以下代码行:
CoreApplication.Properties.Add("listener", socketListener);
根据 MS 示例,此 "save[s] the socket, so subsequent steps can use it." 该应用程序现在按预期工作。非常感谢@Rafael 和@Jay Zuo - MSFT 的帮助!