Java Android中UDP接收函数中数据报的奇怪行为
我正在尝试实现一个UDP测试来了解它。我有一个适用于windows的c#服务器应用程序和一个适用于Android的客户端应用程序 我正在尝试实现一个自制的发现服务。服务器正在使用固定字符串(“LazyRemote”)持续侦听UDP包。当它收到该字符串时,会向客户端发送另一个字符串(“LazyRemote_192.168.1.17:2016”) 我已经向wireshark检查了两个方向发送的数据是否正确,但我在客户端应用程序中收到了一些不正确的信息 android的代码如下:Java Android中UDP接收函数中数据报的奇怪行为,java,android,udp,datagram,Java,Android,Udp,Datagram,我正在尝试实现一个UDP测试来了解它。我有一个适用于windows的c#服务器应用程序和一个适用于Android的客户端应用程序 我正在尝试实现一个自制的发现服务。服务器正在使用固定字符串(“LazyRemote”)持续侦听UDP包。当它收到该字符串时,会向客户端发送另一个字符串(“LazyRemote_192.168.1.17:2016”) 我已经向wireshark检查了两个方向发送的数据是否正确,但我在客户端应用程序中收到了一些不正确的信息 android的代码如下: buttonConn
buttonConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
progress.show();
//This code is executed when user clicks connect button. As it could be a long running operation, it's executed in a new thread to avoid blocking UI
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
String ipAddress = "";
SocketClass my_socketClass = new SocketClass();
InetAddress UDPaddress = my_socketClass.getBroadcastAddress();
int UDPport = 15000;
if(initializationDone == false){
initializationDone = true;
try {
socket_send = new DatagramSocket();
socket_send.setBroadcast(true);
socket_send.setSoTimeout(6000);
socket_receive = new DatagramSocket(UDPport, InetAddress.getByName("0.0.0.0"));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
byte[] send_buff = "LazyRemote".getBytes();
DatagramPacket sendPacket = new DatagramPacket(send_buff, send_buff.length,UDPaddress,UDPport);
socket_send.send(sendPacket);
}catch (Exception ex){
showToast("Imposible enviar primer ack");
}
byte[] receive_buff = new byte[30];
DatagramPacket receivePacket = new DatagramPacket(receive_buff, receive_buff.length);
try {
socket_receive.receive(receivePacket);
String receivedData = new String(receivePacket.getData(), "UTF-8");
if (receivedData.contains("LazyRemote")) {
SocketClass my_socket = new SocketClass(receivePacket.getAddress().toString().substring(1), 2016);
SocketClass.ConnectionStatus connectionStatus = my_socket.establishConnection();
//Remove progressdialog after establishConnection finishes.
progress.dismiss();
//Check connection status.
if (connectionStatus.status == true) {
Thread.sleep(1000);
socket_receive.close();
socket_send.close();
Intent intent = new Intent(MainActivity.this, ActionPerformer.class);
startActivity(intent);
finish();
}
}
} catch (Exception ex) {
progress.dismiss();
showToast("No se han encontrado servidores");
}
//mLock.release();
}
});
thread.start();
}
});
问题是接收功能正在工作,但它正在接收错误的数据。(它接收的字符串与客户端发送给服务器初始化descovery(“LazyRemote”)的字符串相同)
这一定是个愚蠢的错误,但我解决不了。非常感谢。如果您在发送数据的同一端口上进行侦听,则客户端套接字也可以接收您的UDP发送数据包。您只需要从数据分析代码中过滤出这些数据。您应该能够看到源地址与客户端IP地址相同。问题的可能重复不是长度。我收到了一些没有发送的东西。我想这和缓冲区有关,但我找不到。