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

Java Android上丢失UDP套接字数据包,java,android,sockets,Java,Android,Sockets,我面临基于Android设备的UDP数据包丢失问题。我有两个装置。以下代码在一台设备上正常工作。另一台设备丢失了许多软件包。我已经读过了。在此解决方案中,建议将数据报套接字大小设置为64k。但我无法设定它 如何更改数据报缓冲区大小 我的代码: DatagramSocket udpSocket = null; try { udpSocket = new DatagramSocket(5004); udpSocket.setReceiveBufferSize(64*1024);

我面临基于Android设备的UDP数据包丢失问题。我有两个装置。以下代码在一台设备上正常工作。另一台设备丢失了许多软件包。我已经读过了。在此解决方案中,建议将数据报套接字大小设置为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):缓冲区大小:112640
《被选中的anwser》的作者似乎在使用过去式和几乎所有时间都在对现在说话时都有问题,但有一点他确实说了

我删除了设置缓冲区大小的代码,然后它开始接收所有数据包

所以事实上,它改变了数据报缓冲区的大小,这似乎是造成问题的原因

顺便说一下,您设置缓冲区大小的方法可能会起作用,事实上,日志消息会以您的平台缓冲区大小响应您,您不能更改,请参阅。

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

过去代码:

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);

我不知道您必须编写什么程序以及为什么要使用udp套接字,但如果packetloss对您来说是一个问题,那么就不要使用udp套接字。使用Udp,您永远无法确保所有包都达到其目标,并且按照发送顺序发送。我可以使用什么?服务器以单播方式通过rtp向我的设备发送数据包。我通过网络鲨鱼软件观看了所有网络数据包。包似乎是对的。但我面临着android应用程序丢失数据包的问题。这发生在相同的android设备上。例如,Samsung Tab 2和Nexus 4运行正常。很抱歉,我只能回答一个问题:如何更改数据报缓冲区大小?我对你潜在的丢包问题没有任何线索。但有人指出,试图手动设置缓冲区大小可能会导致问题。
ParcelFileDescriptor parcelFileDescriptor = ParcelFileDescriptor.fromDatagramSocket(udpSocket);
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
FileInputStream fin = new FileInputStream(fileDescriptor);

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