2013-02-27 60 views
2

服務器Android應用程序是在PC上:沒有收到UDP報文

sendData = "server msg here".getBytes(); 

DatagramPacket sendPacket = new DatagramPacket(sendData, 
     sendData.length, ipAddr, portNb); 
try { 
    sendSock.send(sendPacket); 
    Thread.sleep(1000); 
    System.out.println("sent msg"); 

} catch (IOException e) { 
    e.printStackTrace(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

字段ipAddrportNb不爲空。在Android應用程序中的線程運行:

sendSocket = new DatagramSocket(); 

sendSocket.setSoTimeout(3000); 
sendSocket.setReuseAddress(true); 

//... 

try { 
    receivePacket = new DatagramPacket(receiveData, receiveData.length); 
    serverSocket.receive(receivePacket); 
    System.out.println("droid now is " 
      + new String(receivePacket.getData())); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

我用兩側的57111端口,我已經重定向它在相同的端口上的Android模擬器。

在Android中,我硬編碼了我的電腦的IP地址,而在服務器端,我嘗試了10.0.2.2,10.0.2.15以及通過使用第二個答案的方法獲得的IP地址this問題。

我已經設置了超時在Android方面的插座和軌跡是:

`02-27 23:12:57.907: W/System.err(13993): java.net.SocketTimeoutException: Try again 
02-27 23:12:57.907: W/System.err(13993): at org.apache.harmony.luni.platform.OSNetworkSystem.recv(Native Method) 
02-27 23:12:57.917: W/System.err(13993): at dalvik.system.BlockGuard$WrappedNetworkSystem.recv(BlockGuard.java:321) 
02-27 23:12:57.927: W/System.err(13993): at org.apache.harmony.luni.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:172) 
02-27 23:12:57.927: W/System.err(13993): at org.apache.harmony.luni.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:181) 
02-27 23:12:57.927: W/System.err(13993): at java.net.DatagramSocket.receive(DatagramSocket.java:402) 
02-27 23:12:57.938: W/System.err(13993): at com.example.testinger.ReceiveThread.run(ReceiveThread.java:39) 
02-27 23:12:58.987: W/KeyCharacterMap(13993): No keyboard for id 0 
02-27 23:12:58.987: W/KeyCharacterMap(13993): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
02-27 23:12:59.377: W/IInputConnectionWrapper(13993): showStatusIcon on inactive InputConnection 
02-27 23:13:00.947: W/System.err(13993): java.net.SocketTimeoutException: Try again 
02-27 23:13:01.057: W/System.err(13993): at org.apache.harmony.luni.platform.OSNetworkSystem.recv(Native Method) ` 

我也試了一下實際的手機上,結果都是一樣的。在Android端,消息不會到達,接收方法會一直等到它超時。它具有的權限

  • android.permission.INTERNET對
  • android.permission.ACCESS_NETWORK_STATE
  • android.permission.ACCESS_WIFI_STATE
  • android.permission.CHANGE_WIFI_MULTICAST_STATE

更新:我嘗試了一個簡單的發送 - 接收程序,但也不起作用: client等待來自的數據包3210顯示之前。

+0

所以仿真器使用10.0.2.2作爲服務器地址?而且,對於真正的Android設備,服務器的IP通常是192.168. *。*這樣的 - 所以您需要對模擬器和設備進行不同的配置。你有沒有考慮到這一點? – cyroxx 2013-02-27 23:41:03

+0

我不確定模擬器的ip可能是問題,但是因爲我硬編碼了每個ip,所以我可以將它想到pc上的服務器上,我不認爲這是問題所在。 – 2013-02-27 23:45:20

+0

那麼,[根據文檔](http://developer.android.com/tools/devices/emulator.html#emulatornetworking)模擬器的IP應該是10.0.2.15,但顯然你已經嘗試過了。也許一個愚蠢的問題,但我假設服務器和模擬器運行在同一臺機器上? – cyroxx 2013-02-28 00:16:31

回答

0

看起來你的服務器或端口無法從設備上訪問。你是否在你的機器上運行任何HTTP服務器,你可以使用瀏覽器來測試它。

或者您可以使用代碼 - 請參考如下─ Android: How to check if the server is available? How to test if a remote system is reachable

+0

我可以並且確實向服務器發送消息,服務器首先等待來自Android應用程序的消息,這是模擬器上我不確定的IP。 – 2013-02-27 22:08:33

+0

嗨,你能清楚地解釋一下流量是如何發生的嗎?誰啓動序列,以及客戶端發送的數據包是在服務器上接收的,反之亦然。可能只是一步一步寫出來會有所幫助。謝謝 – 2013-02-28 10:19:13

+0

1。在服務器上的數據報套接字通過端口57111等待數據報包通過接收方法 – 2013-02-28 12:18:08