我的计算机上有一个802.3有线发送器应用程序,我写的是每隔10ms广播UDP数据包。每个广播数据包都包含一个4字节整数值,该值对于其特定数据包是唯一的,这使我能够在接收器端确切地确定丢弃了多少数据包。
我已经确认变送器可以与Wireshark配合使用。我在同一个网络上设置了四个802.11接收器(2个Android手机和2个笔记本电脑)。笔记本电脑接收了95%的UDP广播包;一部手机收到89%;另一部手机收到了40%。
为什么呢?
这是我的Android接收器代码的一部分:
public class NetThread extends Thread {
int[] pkt_nums;
int p;
NetThread(int[] pkt_nums)
{
this.pkt_nums = pkt_nums;
for (int i=0; i<pkt_nums.length; i++)
{
pkt_nums[i]=0;
}
p = 0;
}
@Override
public void run()
{
receiveData();
}
public void receiveData()
{
// request permission to do network operations in manifest file...done
// start the network side of things
DatagramSocket sock = null;
DatagramPacket pkt = null;
try
{
byte[] data = new byte[C.PAYLOAD_MAX];
sock = new DatagramSocket(C.NET_PORT);
sock.setSoTimeout(C.NET_SO_TIMEOUT);
pkt = new DatagramPacket(data, 0, C.PAYLOAD_MAX);
while (true)
{
Thread.sleep(0); // allow for an interrupt
try
{
sock.receive(pkt);
int length = pkt.getLength();
boolean success = writeToBuffer(pkt.getData(), length);
if (!success) break;
}
catch (InterruptedIOException e)
{
// thrown when a timeout occurs
Log.d(C.DTAG, "net: no packets yet");
}
}
Log.d(C.DTAG, "buffer is full. done receiving.");
if (sock != null) sock.close();
}
catch (InterruptedException x)
{
Log.d(C.DTAG, "net: was interrupted.");
}
catch (SocketException e)
{
Log.d(C.DTAG, "net: SocketException");
e.printStackTrace();
}
catch (IOException e)
{
Log.d(C.DTAG, "net: IOException");
e.printStackTrace();
}
if (sock != null) sock.close();
}
public boolean writeToBuffer(byte[] data, int length)
{
// each packet should have exactly 4 bytes - a number
int pkt_num = data[0] & 0x000000FF | data[1]<<8 & 0x0000FF00 | data[2]<<16 & 0x00FF0000 | data[3]<<24 & 0xFF000000;
if (p < pkt_nums.length)
{
pkt_nums[p++] = pkt_num;
return true; // success
}
else
{
return false;
}
}
}
我在主要活动中声明上述课程如下:
mNetThrd = new NetThread(pkt_nums);
mNetThrd.setDaemon(true);
mNetThrd.start();
我现在会尝试提升线程优先级,但我有一种感觉我做错了。我需要为我的应用程序获得至少95%的UDP广播数据包。
更多细节:笔记本电脑和手机彼此相邻,距离路由器30英尺,具有视线可见度。笔记本电脑1收到了95%的数据包。笔记本电脑2获得94%。电话1收到89%。电话2收到40%。两者都运行相同的应用程序其他网络流量很小。 Android中丢弃的数据包通常一次发生在20-50个组中。 802.11有一个干净的通道。每个数据包包含一个4字节的有效负载。
我的接收器代码是否存在严重错误,或者这是另一个问题吗?