2016-12-19 9 views
4

私は極端なUDPパケットの損失を持っていて意味がありません。次のような状況がある:ホームネットワークに接続されているJavaクライアントを実行しているjava-android UDP unreliability

  1. PCは、ホームネットワーク
  2. ホームルータに接続されているJavaサーバ(アンドロイド)を実行している
  3. 電話は、ブランドの新しいWRT1900acです。ネットワークにはインターネット接続があります。

    1. PCが他のPC(同一ネットワーク上の両方)にUDPパケットを送信した場合、それは非常に動作します:

    2. UDPパケットは、小さな(< 15バイト)

    症状です(ほとんどパケットが失われません)。

  4. Androidが同じネットワーク上のPCにUDPパケットを送信すると、非常にうまく動作します(ほとんどパケットが失われません)。

  5. PCが同じネットワーク上のAndroidにUDPを送信すると、極端なパケット損失(50%以上の時間がかかりますが、それは異なります)が発生します。私は、1つのスルーを取得するために10回のようにパケットを送信するように強制しています

ほとんどの時間。他の時はすべてかなり遅れて行きます。アンドロイドの受信側でのみ発生する非常に奇妙な動作。私がの場合、アンドロイドをjava上で同じコードを実行しているPCに置き換えるか、単にパケット送信者のUDPサーバーでパケットを受信すると、私は失われず、の問題はありません。私が気づいたもう一つのことは、ルータを経由する代わりに、インターネットに接続できない別のアクセスポイントを経由するか、他のクライアントのパフォーマンスが劇的に向上するように見える場合です。これは期待されていますが、私の質問は、Androidの受信側でそのようなものが見られる理由ですパフォーマンスが悪いと多くのパケットを失っています。 Androidが同じコードを実行している別のPCに置き換えられ、同じネットワーク上に問題がない場合。 Androidは、パケットをパケットが失われていない)を送信する問題はありません。したがって、それは受信側で関連する他のアンドロイドでなければなりません...

また、PCコードをPacket Senderに置き換えようとしましたが、同じ結果が得られました。問題はAndroidの受信側のようだ。私はPC側とアンドロイド上で同じUDPコードを実行します。

UDP送信コードは単純です:

public void sendMessage(String message) 
{ 
    try { 
     DatagramSocket ds = new DatagramSocket(); 
     DatagramPacket dp; 
     InetAddress local = InetAddress.getByName(ipPool); 
     dp = new DatagramPacket(message.getBytes(), message.length(), local, port); 
     ds.setBroadcast(true); 
     ds.send(dp); 
     ds.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

UDPサーバクラスにアンドロイドの生活上のコードを受信UDP:

public class UDP_Server 
{ 
    CommandParser commandParser; 

    public UDP_Server(MainActivity mainActivity) 
    { 
     Log.i("Udp tutorial", "---------------------------Starting UDP SERVER"); 

     commandParser = new CommandParser(mainActivity); 
     String text; 
     int server_port = 9876; 
     try 
     { 
      DatagramSocket s = new DatagramSocket(server_port); 
      s.setBroadcast(true); 
      //s.setReceiveBufferSize(163840); 


      while (true) 
      { 
       byte[] message = new byte[1024]; 
       DatagramPacket p = new DatagramPacket(message, message.length); 

       s.receive(p); 
       text = new String(message, 0, p.getLength()); 
       Log.d("Udp tutorial","message:" + text); 
       //commandParser.parseCommand(text); 
       //s.close(); 
      } 
     } catch (SocketException e) 
     { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

UDPServer。私は無線LAN経由(UDPに基づく)TFTPサーバにファイルを送信するいくつかのAndroidデバイスとの破滅的な結果を持っていたが、動作するように見えた

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 

     wm = (WifiManager) getSystemService(WIFI_SERVICE); 

     Log.i("Udp tutorial", "---------------------------HERE 1"); 
     Thread thread = new Thread(new Runnable() 
     { 
      public void run() 
      { 
       UDP_Server svr = new UDP_Server(MainActivity.this); 
      } 
     }); 

     thread.setPriority(Thread.MAX_PRIORITY); 
     thread.start(); 
//  TCPServer server = new TCPServer(); 
    } 
+0

これがこのように解決できるかどうかわからない... wiresharkなどのツールを使用して、ネットワークトラフィックを慎重に観察して、何が起こっているのかを把握しなければならなかったら驚きません。 – GhostCat

+0

上記のように、wiresharkを使って何が起こっているのかを見てみましょう。また、可能であれば別のAndroidデバイスを試して、デバイスに問題があるかどうかを確認してください。 – jython234

答えて

0

:Javaクラスは、主な活動「のonCreate()」メソッドを介してインスタンス化されます他のAndroid搭載端末でもうまく機能します

データブロック(デバイスからサーバまで)は適切に送信されましたが、サーバからデバイスへのackブロックはlimboで失われたようです。

WifiManager wifi = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); 
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); 
multicastLock.setReferenceCounted(true); 
multicastLock.acquire(); 

... 

multicastLock.release(); 

私は( https://www.b4x.com/android/forum/threads/enable-multicast.43321/#post-263242にクレジットを)適切に機能するために、これらの障害のあるデバイス用のマルチキャストロックを取得しなければならなかったアウトターンはこの情報がお役に立てば幸いです。