Geo*_*mas 7 android udp network-programming datagram packets
为了从服务器接收UDP广播包到android设备,我使用服务类并在线程中侦听数据包.它成功接收数据包.问题是如果在同一时间从服务器发送多个数据包,那么将导致数据包丢失.
我甚至尝试使用队列并在单独的线程中处理收到的数据包,然后我也没有收到数据包.我对网络编程完全陌生,任何帮助都会受到广泛赞赏
void startListenForUdpBroadcast() {
UDPBroadcastThread = new Thread(new Runnable() {
public void run() {
try {
InetAddress broadcastIP = InetAddress.getByName(UdpConstants.IP_ADDRESS);
Integer port = UdpConstants.RECEIVER_PORT;
while (shouldRestartSocketListen) {
listenAndWaitAndThrowIntent(broadcastIP, port);
}
} catch (Exception e) {
Log.i("UDP", "no longer listening for UDP broadcasts cause of error " + e.getMessage());
}
}
});
UDPBroadcastThread.setPriority(Thread.MAX_PRIORITY); //Setting The Listener thread to MAX PRIORITY to minimize packet loss.
UDPBroadcastThread.start();
}
Run Code Online (Sandbox Code Playgroud)
此代码侦听新数据包并推送到队列
private void listenAndWaitAndThrowIntent(InetAddress broadcastIP, Integer port) throws Exception {
byte[] recvBuf = new byte[64000];
if (socket == null || socket.isClosed()) {
socket = new DatagramSocket(port, broadcastIP);
socket.setBroadcast(true);
}
//socket.setSoTimeout(1000);
DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
socket.receive(packet);
messQueue.add(packet);
}
Run Code Online (Sandbox Code Playgroud)
这将检查队列中的新消息并对其进行处理
/**
* @purpose Checking queue and If anything is added to the queue then broadcast it to UI
*/
private void checkQueue() {
queueThread = new Thread(new Runnable() {
public void run() {
try {
while (shouldRestartSocketListen) {
if (!messQueue.isEmpty()) {
broadcastIntent(messQueue.poll());
}
}
} catch (Exception e) {
}
}
});
queueThread.start();
}
Run Code Online (Sandbox Code Playgroud)
UDP 的问题是你的发送者(你的服务器)不知道你(你的 Android 设备)错过了一些。它不会丢失,因为您无法足够快地读取它,有时只是通过空中干扰/拥塞或繁忙的套接字。
接收者只会知道:
一旦数据包丢失,它就丢失了。你有两个选择:
(选项 1:所有这些重发请求只是伪 TCP,因此您可能会考虑放弃 UDP 并转而使用 TCP)
| 归档时间: |
|
| 查看次数: |
2296 次 |
| 最近记录: |