2016-07-01 13 views
1

JavaでUDPを操作する際に奇妙な問題が発生しました。 設定:Androidデバイスが通信を初期化しています.WiFi経由で接続されています。私のコンピュータはJava(JRE:1.8)で書かれたサーバを実行し、イーサネット経由で接続されています。Java UDP DatagramSocketはDatagramPacketを受信しません

私は自分のコンピュータにAndroidデバイスからUDPパケットを送信しています:

address = InetAddress.getByName("192.168.178.57"); 
packet = new DatagramPacket(data, data.length, address, 61010); 
socket.send(packet); 

パケットを送信中にスローされる例外はありません。 Wiresharkのは、自分のコンピュータ上で開かれ、私はUDPパケットを受信して​​見ることができます持つ。

私のサーバーアプリケーションで

Wireshark: UDP packet received

私はこのUDPパケットを受信しようとしている:

address = InetAddress.getByName("192.168.178.57"); 
socket = new DatagramSocket(61010, address); 
byte[] receiveBuffer = new byte[4096]; 
System.out.println("listening on " + socket.getLocalAddress().getHostAddress() + ":" + socket.getLocalPort() + "..."); 
// => listening on 192.168.178.57:61010... 

packet = new DatagramPacket(receiveBuffer, receiveBuffer.length); 
socket.receive(packet); 
System.out.println("UDP message received"); 

しかし、それは受信されません。UDP message receivedは決して印刷されません。


ファイアウォールパケットを許可するように構成されるべきである。[編集](ufw allow 61010/udp)。 Javaには、パケットを破棄するセキュリティーマネージャーはありません(System.getSecurityManager()null)。しかし、Androidデバイスの代わりにサーバーアプリケーション経由でUDPパケットを送信すると、そのUDPパケットが受信されます。
[/編集]

私は、このコードは、数ヶ月前に働いていたと私は間にそれに動作しなかったということをかなり確信しています。

何が不足していますか?

+1

サーバコンピュータのファイアウォール設定を確認してください。 wiresharkがパケットをロギングした後にパケットが破棄されている可能性があります。 –

+0

私が知る限り、この行動につながるルールはありません。今私は明示的に 'sudo ufw allow 61010/udp'を使ってこのポートでUDP通信を許可しましたが、何の効果もありません。 –

+0

サーバー側では、ワイルドカードアドレスにバインドして、サーバーが自分のアドレスを知っているか決定する必要がないようにすることがよくあります。ポートだけを引数として取る 'DatagramSocket'コンストラクタを使って、これを達成できます。 –

答えて

0

@ John Bollingerのおかげで、私はファイアウォールのセットアップで2番目と3番目の外観を持っていました。 実際、ファイアウォールがこの問題を引き起こしていました。

明示的に特定のポートをufw allow <port>/udp経由で許可することは、外部UDPパケットをブロックしているすべてのルールをバイパスするには十分ではありませんでした。

resetting the iptables rulesの後、Android Appがサーバーアプリケーションと再び通信できるようになりました。

ありがとうございました!