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パケットを受信して見ることができます持つ。
私のサーバーアプリケーションで私はこの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パケットが受信されます。
[/編集]
私は、このコードは、数ヶ月前に働いていたと私は間にそれに動作しなかったということをかなり確信しています。
何が不足していますか?
サーバコンピュータのファイアウォール設定を確認してください。 wiresharkがパケットをロギングした後にパケットが破棄されている可能性があります。 –
私が知る限り、この行動につながるルールはありません。今私は明示的に 'sudo ufw allow 61010/udp'を使ってこのポートでUDP通信を許可しましたが、何の効果もありません。 –
サーバー側では、ワイルドカードアドレスにバインドして、サーバーが自分のアドレスを知っているか決定する必要がないようにすることがよくあります。ポートだけを引数として取る 'DatagramSocket'コンストラクタを使って、これを達成できます。 –