在Android上丢失UDP套接字数据包

时间:2014-05-14 08:15:42

标签: java android sockets

我正面临基于Android设备的UDP丢包问题。我有两个设备。以下代码在一台设备上正常运行。另一台设备丢失了很多包。我已经阅读了solution of similar problem。在此解决方案中,建议将数据报套接字大小设置为64k。但是我无法设置它。

如何更改数据报缓冲区大小?

我的代码:

DatagramSocket udpSocket = null;
try {
    udpSocket = new DatagramSocket(5004);
    udpSocket.setReceiveBufferSize(64*1024);
    Log.d("UDPSocket", "Buffer Size : " + udpSocket.getReceiveBufferSize());
} catch (SocketException e1) {
    e1.printStackTrace();
}

日志:

05-14 10:34:05.960: D/UDPSocket(28021): Buffer Size : 112640

2 个答案:

答案 0 :(得分:0)

选择的anwser的作者似乎在使用过去式时遇到问题并且几乎所有时间都会说话,但有一次他确实说了

  

我删除了此代码设置缓冲区大小,然后收到所有数据包

所以实际上它正在改变数据报缓冲区大小,这似乎已经引起了它的问题。

顺便说一句,你设置buffersize的方法可能有效,事实上日志消息会响应你的平台缓冲区大小,你无法改变,请参阅Android DatagramSocket receive buffer size

答案 1 :(得分:0)

我解决了我的问题。 我改变了我的接收数据代码。

过去的代码:

byte[] receiveData = new byte[1328];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
try {
    udpSocket.receive(receivePacket);
} catch (IOException e) {
    e.printStackTrace();
}

新代码:

ParcelFileDescriptor parcelFileDescriptor = ParcelFileDescriptor.fromDatagramSocket(udpSocket);
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
FileInputStream fin = new FileInputStream(fileDescriptor);

byte[] receiveData = new byte[1328];
int readByte = fin.read(receiveData);