Java DatagramSocket发送但不接收

Java DatagramSocket发送但不接收,java,networking,datagram,Java,Networking,Datagram,我正在用Java开发一个游戏,我正在尝试通过internet在同一台计算机上的客户端和服务器之间进行通信,并最终在多台计算机之间进行通信。我以前可以,但现在服务器似乎没有从客户端接收任何数据包。我将尝试发布所有相关代码 这在服务器上: private DatagramSocket m_Socket = new DatagramSocket( 8000 ); private DatagramPacket m_DatagramPacket = new DatagramPacket( new byte

我正在用Java开发一个游戏,我正在尝试通过internet在同一台计算机上的客户端和服务器之间进行通信,并最终在多台计算机之间进行通信。我以前可以,但现在服务器似乎没有从客户端接收任何数据包。我将尝试发布所有相关代码

这在服务器上:

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

这是在客户端上:

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

我在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
构造函数将套接字绑定到下一个可用端口,并保证通信中包含一个源端口


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

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


其次,在您的PcWinTech.com v3.0.0屏幕截图中,您的计算机似乎位于子网络中。因此,我猜测IP(“72.49.50.49”)可能是您路由器的IP,我建议您检查路由器的设置,看看路由器是否可以将数据传输到您的计算机,比如端口转发。我刚刚找到了一个可能对您有所帮助的方法。

我忘记了为什么在构造函数中传递null,但我现在已经删除了它。对于防火墙例外,不需要源IP和源端口。谢谢你的建议,但它们不能很好地解决我的问题。但您必须知道UDP是不可靠的,并且您从客户端发送的数据包可能永远不会被服务器接收。因此,您必须实现数据包重新发送机制。这是一种应用程序级协议。谢谢你的提示,我会在解决我的问题后解决这个问题。当你第一次从它发送数据时,一个未绑定的套接字是绑定的。那么,你在同一台机器上为客户端和服务器使用相同的端口吗?“下面的屏幕截图是发送还是接收数据包?”-它正在从发件人地址发送到所示的收件人地址。当您嗅探LAN连接时,这是一个出站数据包。你有防火墙规则允许端口8000上的UDP通信流出吗?@ChiefTwoPencils没有,服务器正在使用8000,客户端的端口是自动分配的。@EJP我不知道防火墙阻止了传出的数据包,所以我想我没有防火墙规则that@EJP仔细想想,我不需要一个规则来允许客户端分配的端口上的出站流量(屏幕截图中的61485)不是我。。。无论如何,我也尝试了端口转发,但我将阅读本文以了解更多信息,因为您没有提供具体的答案,而是提供了一系列假设和建议;通常情况下,评论会更好。也不是-1。@Chieftwoils是的,,,也许你是对的。我整个上午都在思考这个问题,做了很多测试。但最后我可以得到这两个假设……无论如何,谢谢你的评论。@JoeBoris在尝试端口转发后,它仍然不能工作吗?也许你可以先尝试在同一个子网中运行服务器和客户端程序,以检查现有代码是否有问题。@JoeBoris如果仍然不能接收数据,请将您的代码发送给我…因为我真的很想解决这个问题…我的电子邮件可以是:whbfcc@126.com
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 );
private DatagramSocket m_Socket = new DatagramSocket();
private DatagramPacket m_DatagramPacket = new DatagramPacket( new byte[ 1024 ], 1024 );