Java DatagramSocket 发送但不接收

标签 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 连接到服务器

最佳答案

如果您的客户端正在创建一个无限的 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/

相关文章:

java - 使用 Java API 批量插入 Google Cloud Storage?

java - 如何使用 java sdk 和 web-flux 将 multipart/form-data 上传到 AmazonS3?

android - 在 Android NDK 上构建 OpenSSL

java - jackson 日期格式问题 : java bean to JSON string conversion

java - 使用 JWT 的 Keycloak SSO 这可能吗?

java - Android 上的多播不想在屏幕关闭时工作

objective-c - NSNetService 的 TXTRecordData 解析后为零

networking - 如何使用命令行禁用 VirtualBox 网络接口(interface)?

Java-SocketException : Not a multicast address

Android:SSDP 卡在 MulticastSocket.receive() 上