2013-08-16 74 views
0

此Android代碼未收到數據包。該代碼基於一些正常工作的java代碼。有人可以提出意見,可能是什麼問題。我們沒有在模擬器上運行,所以它不是人們所遇到的模擬器問題。發件人應用程序正在使用android平板電腦的wi-fi平板電腦地址以及發件人和收件人中的udp端口匹配。Android代碼未收到UDP數據包

它可能是應用程序正在丟棄數據包。

import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 

public class NetworkServer extends Thread 
{ 

    DatagramSocket mSocket = null; 
    boolean isFinish = false; 

    private SimplestPossibleActivity activity; 

    public NetworkServer(SimplestPossibleActivity activity) 
    { 
    this.activity = activity; 
    } 

    public void run() 
    { 

     try 
     { 

     Log.d("UDP", "Listening"); 
     mSocket = new DatagramSocket(2010); //4444 
     mSocket.setBroadcast(true); 

     while (!isFinish) 
     { 

      Log.d("UDP", "C: socket create success"); 
      byte[] recvbuffer = new byte[12]; 
      DatagramPacket packet = new DatagramPacket(recvbuffer,recvbuffer.length); 
      Log.d("UDP", "receiving..."); 
      mSocket.receive(packet); 
      Log.d("UDP", "received packet"); 

      ByteBuffer bb = ByteBuffer.allocate(recvbuffer.length). 
             order(ByteOrder.LITTLE_ENDIAN); 
      bb.put(recvbuffer); 
      bb.rewind(); 
      //System.out.println(bb.getFloat()); 
      //System.out.println(bb.getFloat()); 
      //System.out.println(bb.getFloat()); 

      // byte[] buffer = packet.getData(); 
      // String msg = new String(buffer); 

      // bundle data to send to message handler 
      Bundle data = new Bundle(); 
      data.putFloat("latitude", bb.getFloat()); 
      data.putFloat("longitude", bb.getFloat()); 
      data.putFloat("altitude", bb.getFloat()); 

      Message msgHandle = new Message(); 
      msgHandle.setData(data); 
      mhandler.sendMessage(msgHandle); 

     } //end while 
    } catch (Exception e) { 
     Log.e("UDP", "C: Error", e); 
    } 

    } 

    private Handler mhandler = new Handler() 
    { 

     @Override 
     public void handleMessage(Message msg) 
     { 
      float lat; 
      float lon; 
      float alt; 

      Bundle data = msg.getData(); 
      Log.d("NetworkServer","adding position" + "lat = " + data.getFloat("latitude") + 
           "lon = " + data.getFloat("longitude") + 
           "alt = " + data.getFloat("altitude")); 
      activity.addPosition(data.getFloat("latitude"), 
           data.getFloat("longitude"), 
           data.getFloat("altitude")); 

    } 

    }; 
} 
+0

[Android的UDP網絡接收器不接收任何WI-FI上的數據]的可能重複(http://stackoverflow.com/questions/18279015/android-udp-networkreceiver-not-receving-any-data-on-wi- FI) – garlicman

回答

1

那麼我已經看到Android不接受肯定廣播的UDP數據包。我仍然在試圖確定問題。

您的服務器代碼應該沒問題。 recvbuffer對於預期的數據來說是合適的大小,並且我假設如果它實際上正在接收UDP數據包,你會解釋任何有經驗的錯誤。這意味着,無論您的用例是什麼,UDP數據包都不會被服務器接收,因爲它沒有被髮送,或者被中斷。

1)我相信你在PC上使用發件人應用程序,而不是在Android設備上。 (「發件人應用程序正在使用android平板電腦的wi-fi平板電腦地址以及發件人和收件人中的udp端口匹配項。」)如果是這種情況,請安裝Wireshark並偵聽發送的UDP數據包。確認數據包確​​實正在發送。

2)我假設你沒有從同一臺PC上測試原始的Java代碼。例如接收者和發送者在同一臺PC上。您是否將個人電腦上的發件人測試到Android接收器應用程序?

3)我還假設您在AndroidManifest.xml文件中擁有正確的最低Android權限。例如如果你正在組播UDP,你需要做的不僅僅是這些,但我不相信你。

聲稱丟棄數據包的唯一方法是確定它們實際上已發送到網絡中。 (如果可能,請使用Wireshark)您的數據包大小很小,因此沒有理由認爲任何路由器會根據大小限制丟棄數據包。

嘗試提交客戶端代碼並解釋測試場景如何正確運行。