0

此 Android 代码未接收数据包。该代码基于一些可以正常工作的java代码。有人可以提供意见,可能是什么问题。我们没有在模拟器上运行,所以它不是人们遇到的模拟器问题。发件人应用程序正在使用 android 平板电脑 wi-fi 平板电脑地址以及发送者和接收者中的 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"));

    }

   };
}
4

1 回答 1

1

好吧,我已经看到 Android 不接受肯定广播的 UDP 数据包。我仍在尝试确定问题。

您包含的服务器代码应该没问题。recvbuffer 是预期数据的正确大小,我假设如果它实际上正在接收 UDP 数据包,您会解释任何遇到的错误。这意味着,无论您的用例是什么,服务器都没有收到 UDP 数据包,因为它没有被发送,或者它被中断了。

1)我相信您在 PC 上使用发件人应用程序,而不是 Android 设备。(“发送方应用程序正在使用 android 平板电脑 wi-fi 平板电脑地址以及发送方和接收方中的 udp 端口​​匹配。”)如果是这种情况,请安装 Wireshark 并侦听发送的 UDP 数据包。确认确实正在发送数据包。

2) 我假设您没有从同一台 PC 测试原始 Java 代码。例如,接收方和发送方在同一台 PC 上。您是否在 PC 上测试发送器到 Android 接收器应用程序?

3) 我还假设您在 AndroidManifest.xml 文件中具有正确的最低 Android 权限。例如,如果您正在多播 UDP,您需要做的不止于此,但我不相信您会这样做。

声称数据包被丢弃的唯一方法是确定它们实际上是发送到网络中的。(如果可能,Wireshark)您的数据包非常小,没有理由认为任何路由器会根据大小限制丢弃数据包。

尝试提交客户端代码并解释您的测试场景是如何工作的。

于 2013-09-24T18:19:16.060 回答