Java Android多播接收器仅适用于小数据包
我正试图用我的android应用程序在本地网络上接收多播数据包。变送器在两种不同的数据模式下工作 在这两种模式中,数据每半秒传输一次 在一种模式中,输出数据包约为2675字节。在这种模式下,我接收100%的传输数据包 在另一种模式中,输出分组约为50216字节。在这种模式下,我很少收到数据包(大约98%的数据包丢失) 对于同一网络上的Linux PC,我运行python脚本来接收多播,它在两种模式下都接收100%的数据包。这意味着问题是我的android设备的本地问题,而不是网络问题 有人能提出这个问题的原因和解决办法吗?我的代码的相关部分如下:Java Android多播接收器仅适用于小数据包,java,android,sockets,networking,multicast,Java,Android,Sockets,Networking,Multicast,我正试图用我的android应用程序在本地网络上接收多播数据包。变送器在两种不同的数据模式下工作 在这两种模式中,数据每半秒传输一次 在一种模式中,输出数据包约为2675字节。在这种模式下,我接收100%的传输数据包 在另一种模式中,输出分组约为50216字节。在这种模式下,我很少收到数据包(大约98%的数据包丢失) 对于同一网络上的Linux PC,我运行python脚本来接收多播,它在两种模式下都接收100%的数据包。这意味着问题是我的android设备的本地问题,而不是网络问题 有人能提出
@Override
public void onResume() {
super.onResume();
new Thread(new MulticastRx()).start();
}
class MulticastRx implements Runnable {
@Override
public void run() {
try {
final WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
final String multicastLockName = "MY_LOCK";
WifiManager.MulticastLock multicastLock = null;
if (wifiManager != null) {
multicastLock = wifiManager.createMulticastLock(multicastLockName);
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
} else {
Log.e("TEST", "LOCK FAILED");
}
byte[] recvBuf = new byte[65536];
int port = 11000;
InetAddress group = InetAddress.getByName("224.0.0.1");
MulticastSocket multicastSocket = new MulticastSocket(port);
multicastSocket.joinGroup(group);
Log.d("TEST", "Staring RX Loop");
while (multicastLock!=null && multicastLock.isHeld()) {
DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
multicastSocket.setSoTimeout(10000);
try {
multicastSocket.receive(packet);
mTimeOutDisplayed = false;
String senderIP = packet.getAddress().getHostAddress();
Log.d("TEST", "SENDER:" + senderIP + " -> " +
"Multicast:/" + group + ":" + String.valueOf(port) +
" [" + String.valueOf(packet.getLength()) + "]"
);
} catch (SocketTimeoutException e) {
if (!mTimeOutDisplayed) {
Log.w("TEST", "SocketTimeoutExceptions: " + group);
mTimeOutDisplayed = true;
}
}
}
Log.e("TEST", "Lost Lock");
} catch (Exception e) {
e.printStackTrace();
}
}
}