1

sが受け取れませんDatagramPacket。ただし、wireshark を使用すると、パケットが到着していることを確認できました。このサイトで考えられる解決策に関する同様の質問を見たことがありますが、あまり役に立ちませんでした (すでにファイアウォールの無効化などを試みました)。私のコードは簡単です:

// Create socket
DatagramSocket socket = new DatagramSocket(5554);
socket.connect(InetAddress.getByName("192.168.1.1"), 5554);

try {           
    while(!stop) {
        keepAwake(); // This sends some bytes using socket.send(...), works perfectly fine
        DatagramPacket packet = new DatagramPacket(new byte[2048], 2048);
        socket.receive(packet); // Does not work :(
        System.out.println("[DEBUG] Packet received!"); // Never happens

        // Parse packet
    }
} catch (Exception e) {
    e.printStackTrace(); // Also no exceptions are thrown
}

ここで何が問題になる可能性がありますか?ところで、私の OS は Ubuntu 12.10 で、パケットはソース コードを持っていない C で記述されたサーバーから送信されます (DatagramSocket は、Java DatagramSocket から送信された DatagramPackets のみを受信しますか?)。

提案があれば本当に感謝します!

4

3 に答える 3

1

「connect()」の代わりに、IPが0.0.0.0で、必要なポートを使用してbind()を試してください。

編集:実際には、コンストラクターはすでにそれをバインドしているので、接続を省略するだけで十分です。

ドキュメントから:

ソケットがリモートアドレスに接続されている場合、パケットはそのアドレスとの間でのみ送受信できます。

これがおそらく、パケットを受信して​​いない理由です。

于 2012-12-31T10:47:14.747 に答える
0

解決しました!問題は次のことではありませんでしたDatagramSocket: 受信する必要のあるパケットが、奇妙なアドレス (私の PC ではない) に送信されました。パケットを受信したかったのはAR.Droneなので、最終的にPCにパケットを送信するように指示することができました. 今、私はそれらを受け取ることができます!

于 2012-12-31T20:14:10.173 に答える
0

192.168.1.1 がルーターである場合、パケットはおそらくそこから発信されていないため、そこに接続するべきではありません。他のソースからのパケットを除外する必要がない限り、実際には connect() を呼び出す必要はまったくありません。または、パケットの実際の送信元アドレスに接続します。

いいえ、DatagramSocket は他の DatagramSocket からの受信に制限されません。

于 2012-12-31T11:22:39.897 に答える