2012-03-26 137 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

服務器發送到錯誤的端口。它應該在收到的數據報中發送到端口,而不是它自己的端口。重用請求數據報最簡單,只需將數據更改爲響應數據:返回地址已經存在。

相關問題