0

私は、PC 側のサーバー アプリケーションと連携するモバイル アプリケーション (Android) を開発しています。WIFI エリアに接続されたスマートフォンで情報を送信するには、マルチキャスト UDP データグラムを使用する必要があります。2 つのモジュールがあります。最初のモジュールは UDP マルチキャスト サーバーです。

private void connection() {
    System.setProperty("java.net.preferIPv4Stack", "true");
    String msg = "Hello";
    InetAddress group = null;
    try {
        group = InetAddress.getByName("224.0.2.0");
    } catch (UnknownHostException e3) {
        // TODO Auto-generated catch block
        e3.printStackTrace();
    }
    while (true) {
        MulticastSocket s = null;
        try {
            s = new MulticastSocket(6789);
        } catch (IOException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        try {
            s.joinGroup(group);
            s.setTimeToLive(200);

        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        DatagramPacket hi = new DatagramPacket(msg.getBytes(),
                msg.length(), group, 6789);
        try {

            s.send(hi);
            System.out.println(hi.toString());
            s.leaveGroup(group);
            s.close();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

この関数 (up) は MulticastSocket を作成し、マルチキャスト アドレス224.0.2.0:6789で情報を送信します。

2 番目のモジュールは、最初のプログラムによって送信された UDP パケットの Java レシーバーです。

byte[] b = new byte[1024]; 
            DatagramPacket dgram = new DatagramPacket(b, b.length); 
            MulticastSocket socket = null;
            try {
                socket = new MulticastSocket(6789);
            } catch (IOException e) {
                Log.e("WIFI_E", e.getMessage());
            } // must bind receive side
            try {
                socket.joinGroup(InetAddress.getByName("224.0.2.0"));
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            //while(true) { 
             try {
                socket.receive(dgram);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } // blocks until a datagram is received
             Toast.makeText(getApplicationContext(), "Received " + dgram.getLength() + 
                        " bytes from " + dgram.getAddress(), Toast.LENGTH_LONG); 
             dgram.setLength(b.length); // must reset length field!
            //} 

これは私のコードです。今問題。サーバー (PC 側) を起動しているとき、UDP パケットはローカルホスト マシン (Wireshark でテスト済み) でのみ表示され、スマートフォンまたは他の PC はそれらを受信できません。Windows ファイアウォールとウイルス対策をオフにしようとしましたが、機能しません。ネットワーク上でパケットが正しくリダイレ​​クトされない理由がわかりません。私のコードにいくつかのエラーがありますか?ありがとうございます。

4

1 に答える 1

0

Android デバイスでは、MulticastLock を取得する必要があります。次の権限も必要です。

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

そうは言っても、Android でのマルチキャスト サポートは、一部のユーザーが期待するほどしっかりしていないようです。http://codeisland.org/2012/udp-multicast-on-android/を参照してください。

つまり、実際にうまくいくかどうか、またはデバイスに依存する可能性があるかどうかです。Nexus5 で動作しない

于 2014-01-27T02:30:59.887 に答える