我正在用 Java 开发游戏,我正在尝试通过互联网在同一台计算机上的客户端和服务器之间进行通信,并最终在多台计算机之间进行通信。我以前可以,但现在服务器似乎没有收到来自客户端的任何数据包。我会尝试发布所有相关代码。
这是在服务器上:
private DatagramSocket m_Socket = new DatagramSocket( 8000 );
private DatagramPacket m_DatagramPacket = new DatagramPacket( new byte[ 1024 ], 1024 );
...
while( true )
{
m_Socket.receive( m_DatagramPacket );
byte[] data = new byte[ 1024 ];
data = m_DatagramPacket.getData( );
System.out.println( "SERVER RECEIVING: " + data );
}
这是在客户端:
private DatagramSocket m_Socket = new DatagramSocket( null );
private DatagramPacket m_DatagramPacket = new DatagramPacket( new byte[ 1024 ], 1024 );
...
m_DatagramPacket.setAddress( InetAddress.getByName( "72.49.50.49" ) );
m_DatagramPacket.setPort( 8000 );
m_DatagramPacket.setLength( length );
m_DatagramPacket.setData( data );
// "data" is the byte array, "length" is the length of the array
m_Socket.send( m_DatagramPacket );
我在 Wireshark 中看到数据包,所以我知道它正在发送。
编辑:我可能不明白 Wireshark 是如何工作的,下面的截图是发送还是接收数据包?
无 Wireshark 鱼:
防火墙异常:
端口转发:
编辑:
我还运行了这个端口测试程序来测试端口 8000,它说端口是开放的
更新: 出于某种原因,我猜我们的路由器只是拒绝从源本地 IP 到外部 IP 目的地的连接。我可以使用来自同一网络的本地 IP 和来自不同网络的外部 IP 连接到服务器
最佳答案
如果您的客户端正在创建一个无限的 DatagramSocket
(通过将 null
传递给 DatagramSocket(SocketAddress bindaddr)
),这意味着将不是该套接字的任何原始端口。尽管这可能有效,但这显然不是正确的方法。在您的客户端,您必须进行以下更改。
private DatagramSocket m_Socket = new DatagramSocket();
private DatagramPacket m_DatagramPacket = new DatagramPacket( new byte[ 1024 ], 1024 );
使用默认的 DatagramSocket
构造函数会将套接字绑定(bind)到下一个可用端口,并保证通信中涉及源端口。
并且您的防火墙异常(exception)没有源 IP 和源端口模式或限制。请根据您的路由器检查是否需要这样做。
关于Java DatagramSocket 发送但不接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26090873/