0

こんにちは、特定のポート番号でDatagramSocketを使用してブロードキャストを送信しています。正常にメッセージを送信します。しかし、私は開いているIPアドレスと任意のポート番号を受信メッセージをlistenするときにそれはsockettimeoutoutceptionを投げている。しかし、同じネットワークに接続されています。任意のIPと任意のポート番号を持つデータグラムソケットを聞くandroid

//マニフェスト

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

//定義されているポート番号、グローバル非同期タスクを開始

int PORT=2739; 

//

new MyClientTask().execute(); 

///非同期タスク

public class MyClientTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... arg0) { 

      new PacketSender().run(); 
      new PacketReceiver().run(); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 


     } 

    } 

これは、これは私のリスニング要求

public class PacketReceiver implements Runnable { 
     @Override 
     public void run() { 
      DatagramSocket receiveSoc = null; 
      try { 
       //here 0 represent any port number including system reserved port number 
       receiveSoc = new DatagramSocket(0, InetAddress.getByName("0.0.0.0")); 
       receiveSoc.setBroadcast(false); //also tried with true 
       receiveSoc.setSoTimeout(5000); //alse tried with removing timeout value 

       int i = 0; 
       while (true) { 
        Log.d("data value", " " + i); 
        i++; 
        byte buf[] = new byte[1024]; 
        DatagramPacket pack = new DatagramPacket(buf, buf.length); 

        try { 
         receiveSoc.receive(pack); 

         String message = new String(pack.getData()).trim(); 
         Log.i("test", message + " server ip : " + pack.getAddress().getHostAddress()); 

        } catch (UnknownHostException e) { 
         e.printStackTrace(); 
        } 
       } 
      } catch (SocketTimeoutException e) { 
       Log.d("Main", "SocketTimeoutException"); 
       e.printStackTrace(); 
       receiveSoc.close(); 
       new PacketReceiver().run(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       Log.d("Response", "IOException"); 
       e.printStackTrace(); 
      } 
     } 
    } 

が// IP

public InetAddress getBroadcastIp() throws IOException { 
     DhcpInfo dhcp = myWifiManager.getDhcpInfo(); 
     int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; 
     byte[] quads = new byte[4]; 
     for (int k = 0; k < 4; k++) 
      quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); 
     return InetAddress.getByAddress(quads); 
    } 

それは内のすべてのホストからのブロードキャストメッセージを受信することができる放送ばかりである私の要求送信

public class PacketSender implements Runnable { 
     @Override 
     public void run() { 
      DatagramSocket sendSoc = null; 
      try { 
       sendSoc = new DatagramSocket(); 
       sendSoc.setBroadcast(true); 
       sendSoc.setSoTimeout(5000); 
       sendSoc.setReuseAddress(true); 
       byte[] ip = prop.ToBuffer(); 
       DatagramPacket packet = new DatagramPacket(ip, 
         ip.length, getBroadcastIp(), PORT); 
       Log.d("Sending", packet.getAddress().getHostAddress() + " " + packet.getPort()); 
       sendSoc.send(packet); 
       sendSoc.close(); 
      } catch (IOException e) { 
       Log.d("Send", "IOException"); 
       e.printStackTrace(); 
       if (sendSoc != null) 
        sendSoc.close(); 
      } 
     } 
    } 

です私が通信したいハードウェア以外のLAN。私はそれに放送を送ることができます。しかし、私はこの特定のデバイスから放送を受信することができません。

+0

明確でない場合は、私にコメントしてください。 – Nas

答えて

0

のようなものをお勧めします。ネットワーク内のパケット転送に問題はありません。 setBroadcastの値がtrueの同じソケットオブジェクトでブロードキャストを送受信します。したがって、ソケットはブロードキャストを送信し、同じブロードキャストからのブロードキャストを受信します。リスニングブロードキャストには別のソケットオブジェクトを使うべきではありません。私は非常に遅くそれを理解する。

public class PacketSender extends Thread { 
     @Override 
     public void run() { 
      DatagramSocket sendSoc = null; 
      try { 
       sendSoc = new DatagramSocket(); 
       sendSoc.setBroadcast(true); 
       InetSocketAddress address = new InetSocketAddress(getBroadcastQuadIp(), PORT); 

       byte[] ip = prop.ToBuffer(); 
       DatagramPacket packet = new DatagramPacket(ip, 
         ip.length, address.getAddress(), address.getPort()); 


       sendSoc.send(packet);  

       //////////// receiver begin 
       int i = 0; 
       while (true) { 

        i++; 

        final byte buf[] = new byte[1024]; 
        final DatagramPacket pack = new DatagramPacket(buf, buf.length); 
        try { 
         sendSoc.receive(pack); 

         String message = new String(pack.getData()).trim(); 

         Log.i("test", message + " server ip : " + pack.getAddress().getHostAddress()); 

        } catch (UnknownHostException e) { 
         e.printStackTrace(); 

        } 
       } 
      } catch (IOException e) { 
       Log.d("Send", "IOException"); 
       e.printStackTrace(); 
       if (sendSoc != null) 
        sendSoc.close(); 
      } 
     } 
    } 
0

は、あなたのコードにこれらの変更を行います。

public class PacketSender implements Runnable { 

    @Override 
    public void run() { 

     // ... 

     DatagramPacket packet = new DatagramPacket(ip, 
       ip.length, InetAddress.getByName("255.255.255.255"), PORT); 

     // ... 
    } 
} 
public class PacketReceiver implements Runnable { 

    @Override 
    public void run() { 

     // ... 

     receiveSoc = new DatagramSocket(PORT, InetAddress.getByName("0.0.0.0")); 

     // ... 
    } 
} 

UPDATE

それは送信者と受信者を順次呼び出すためMyClientTaskコードは動作しません。送信者は誰にも送信せず、受信者はメッセージがなくても永遠に待機します。受信者が既にデータグラムを聞いている間に、送信者に電話をしなければなりません。

ので、代わりに

new MyClientTask().execute(); 

のあなたは、私が下側からこの問題を修正し

new Thread(new PacketReceiver()).start(); 

// Just to make sure that the receiver has started up. 
// You'll want to do a different kind of synchronization. 
SystemClock.sleep(50); 

new Thread(new PacketSender()).start(); 
+0

お返事ありがとうございます。動いていない 。それでもmsgを送信しない。それがうまくいく前に。 – Nas

+0

@Nasこれらのランナブルを呼び出すコードを投稿してください。 – nandsito

+0

@Nasマニフェスト使用許可インターネットに追加しませんでしたか? – nandsito

関連する問題