簡體   English   中英

Java DatagramSocket發送但不接收

[英]Java DatagramSocket sending but not receiving

我正在使用Java開發游戲,並且試圖通過Internet在同一台計算機上的客戶端和服務器之間進行通信,最終在多台計算機之間進行通信。 我曾經能夠,但是現在服務器似乎沒有從客戶端接收任何數據包。 我將嘗試發布所有相關代碼。

這是在服務器上:

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屏幕截圖

防火牆例外: 開啟端口8000

轉發端口: 轉發端口8000

編輯:我也運行了此端口測試程序以測試端口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 );

使用Default DatagramSocket構造函數會將套接字綁定到下一個可用端口,並保證通信中涉及源端口。

而且您的防火牆例外沒有源IP和源端口模式或限制。 請根據您的路由器檢查是否需要這樣做。

首先,假設您編寫的IP和其他代碼正確無誤,我已經做了很多測試,甚至嘗試更改防火牆的設置。但是它仍然可以正常工作。 因此,我認為也許是由於UDP協議的不可靠性,您的服務器有時無法從客戶端接收數據。您可以嘗試使用TCP協議。

其次,在PcWinTech.com v3.0.0的屏幕快照中,您的計算機似乎在子網中。 因此,我建議IP(“ 72.49.50.49”)是您路由器的IP,建議您檢查路由器的設置,看看路由器是否可以將數據傳輸到計算機,例如端口轉發。查找可能對您有幫助的文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM