此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"));
}
};
}
答案 0 :(得分: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)您的数据包大小非常小,以至于没有理由认为任何路由器会根据大小限制丢弃数据包。
尝试提交客户端代码并解释您的测试方案是如何正常工作的。