UDP客户端向服务器发送数据,但没有收到响应
问题描述:
我正在创建一个简单的Android应用程序,可以与我的PC通信。在我的电脑上,我有一个非常简单的Java服务器。UDP客户端向服务器发送数据,但没有收到响应
public void run(){
try{
DatagramSocket serverSocket = new DatagramSocket(port);
byte[] receiveData = new byte[8];
byte[] sendData = new byte[8];
while(true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String(receivePacket.getData());
System.out.println("RECEIVED: " + sentence);
InetAddress IPAddress = receivePacket.getAddress();
String sendString = "polo";
sendData = sendString.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}catch (Exception e){
}
}
和我有Android应用内的另一个简单的代码,它发送一个UDP包发送到服务器,并等待响应。
public void checkServerOnline(View v) {
try {
int port = 46001;
DatagramSocket clientSocket = new DatagramSocket();
clientSocket.setSoTimeout(1800);
InetAddress IPAddress = InetAddress.getByName(host);
byte[] sendData = new byte[8];
byte[] receiveData = new byte[8];
String sentence = "marco";
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
clientSocket.close();
} catch (Exception e) {
}
我遇到的问题是我的客户端正在等待等待响应。服务器肯定收到字符串“marco”,并且可能发送响应“polo”,但客户端没有收到它。我尝试删除客户端上的超时,但它只是冻结,直到我强制关闭应用程序。
任何人都可以在我的代码中看到一个错误?我不明白为什么它不起作用。我已经成功地使用相同的设置成功设置了TCP服务器和客户端,但似乎无法执行UDP。
答
服务器发送到错误的端口。它应该在收到的数据报中发送到端口,而不是它自己的端口。重用请求数据报最简单,只需将数据更改为响应数据:返回地址已经存在。
您是否使用Wireshark或其他网络嗅探器来检查服务器是否实际发送响应? – Thomas 2012-03-26 00:17:27
我没有,但我现在就做了。服务器正在发送响应。问题在于它将它发送到错误的端口。我需要在服务器中添加代码来检查数据包来自哪个端口。我认为它只是与目的地港口相同 - 不知道为什么。感谢Wireshark提示 – 2012-03-26 00:28:21