2012-03-26 136 views
1

我正在创建一个简单的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。

+0

您是否使用Wireshark或其他网络嗅探器来检查服务器是否实际发送响应? – Thomas 2012-03-26 00:17:27

+0

我没有,但我现在就做了。服务器正在发送响应。问题在于它将它发送到错误的端口。我需要在服务器中添加代码来检查数据包来自哪个端口。我认为它只是与目的地港口相同 - 不知道为什么。感谢Wireshark提示 – 2012-03-26 00:28:21

回答

1

服务器发送到错误的端口。它应该在收到的数据报中发送到端口,而不是它自己的端口。重用请求数据报最简单,只需将数据更改为响应数据:返回地址已经存在。

相关问题