Java DatagramSocket发送但未接收

时间:2014-09-29 00:08:02

标签: java networking datagram

我正在开发一个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的: Wireshark screenshot

防火墙例外: Opening port 8000

端口转发: Forwarded port 8000

编辑: 我还运行了这个端口测试程序来测试端口8000,它说端口是打开的 Port tester

更新: 出于某种原因,我猜我们的路由器只是拒绝从源本地IP到外部IP目的地的连接。我可以使用来自同一网络的本地IP连接到服务器,并使用来自不同网络的外部IP

2 个答案:

答案 0 :(得分:0)

如果您的客户端正在创建无界DatagramSocket(通过将null传递给DatagramSocket(SocketAddress bindaddr)),这意味着该套接字将不会有任何原始端口。尽管这可能有效,但这显然不是正确的方法。在您的客户端,您必须进行以下更改。

private DatagramSocket m_Socket = new DatagramSocket();
private DatagramPacket m_DatagramPacket = new DatagramPacket( new byte[ 1024 ], 1024 );

使用默认DatagramSocket构造函数将套接字绑定到下一个可用端口,并保证通信中涉及源端口。

您的防火墙例外没有源IP和源端口模式或限制。请根据您的路由器检查是否需要。

答案 1 :(得分:0)

首先,假设您编写的IP和其他代码但上面没有正确,我做了很多测试,甚至尝试更改防火墙的设置。但它仍然有效。 因此,我认为可能是因为UDP协议不可靠,您的服务器有时无法从客户端接收数据。您可以尝试使用TCP协议。

其次,在PcWinTech.com v3.0.0的屏幕截图中,您的计算机似乎位于子网中。所以我敢说IP(“72.49.50.49”)可能是你的路由器的IP,我建议你检查路由器的设置是否路由器可以将数据传输到你的计算机,比如端口转发。我只是找到可能对您有所帮助的article