下午,
我在 VPS 上运行此代码:
while (isRunning)
{
UdpReceiveResult result = await upClient.ReceiveAsync();
if (isFirstConnection)
{
downClient.Connect(result.RemoteEndPoint.Address, 8000);
isFirstConnection = false;
}
Debug.Log("Data received");
byte[] buffer = result.Buffer;
await downClient.SendAsync(buffer, buffer.Length);
Debug.Log("Data sent " + result.RemoteEndPoint.Address);
}
这似乎有效并将数据发送回原始计算机,但下面的代码没有收到它。 Debug.Log("Data sent " + result.RemoteEndPoint.Address) 显示正确的 IP。
downClient = new UdpClient(8000);
Debug.Log("Start Receive");
while (isRunning)
{
UdpReceiveResult result = await downClient.ReceiveAsync();
Debug.Log("Getting data" + result.Buffer[0]);
}
我已在 VPS 防火墙上打开端口,但未在本地防火墙上打开端口,因为这需要在任何计算机上运行。当服务器和客户端都在同一台机器上时,它可以完美地工作。
我有什么做错的地方吗?这是防火墙问题吗?如果是,我该如何解决? 任何帮助或调试技巧表示赞赏。
编辑:按照@jdweng的建议,我一直在使用Netstat来查看启动客户端时打开的端口。我注意到了这一点:
UDP 0.0.0.0:64455 88.208.xx.xxx:8000 IP 地址是我的 VPS 的地址,因此推测这就是我的数据发送的地方。每次运行客户端时,端口号显然是随机变化的。
现在的问题是如何从客户端内部获取此端口号?
像往常一样,面对这些问题,我找错了地方。简单的答案是我的代码是错误的。
这就是它应该看起来的样子。
服务器:
while(true){
UdpReceiveResult result = await UDPClient.ReceiveAsync();
byte[] buffer = result.Buffer;
await Server.UDPClient.SendAsync(newData, newData.Length, result.RemoteEndPoint);
}
客户端发送循环:
while(true)
{
await Client.SendAsync(bytes, bytes.Length, serverEndPoint);
}
客户端接收循环:
while (isRunning)
{
UdpReceiveResult result = await Client.ReceiveAsync();
bytes[] newData = result.Buffer;
}
就这么简单。只要使用同一个客户端发送和接收,客户端就会将消息中的本地端点发送到服务器。一旦您调用 receive,它就会自动侦听该端点。