2012-04-27 56 views
1

我在Android 4.0的書面方式一UDP服務器程序(API 15) 程序啓動的時候,我上無法連接到服務器的UDP Android中UDP6 CLOSE編程時,機器人UDP服務器

環境

virtualbox, android x84 4.0, ping to/from virtualbox-android are ok, 

UDP服務器代碼

DatagramSocket ds = new DatagramSocket(9101); 
<uses-permission android:name="android.permission.INTERNET" /> 

netstat的android系統中顯示

udp6 0 0 :::9101 :::* CLOSE 

我怎樣才能使一個普通的IPv4 UDP監聽套接字?

回答

0

嘗試

DatagramSocket ds = new DatagramSocket(9101, InetAddress.getByName("192.168.1.1")); 

,看看是否能工作了。您也可以先創建套接字並稍後進行綁定,如:

DatagramSocket ds = new DatagramSocket(null); 
ds.bind(new InetSocketAddress("192.168.1.1", 9101)); 
0

您無法在主線程中接收或執行網絡通信。

你必須創建一個單獨運行的線程來做到這一點:

new Thread(new Runnable() { 
    public void run() { 
    try { 
      if (clientsocket == null) { 
     clientsocket = new DatagramSocket(null); 
      clientsocket.bind(new InetSocketAddress("0.0.0.0", 1337)); 
     clientsocket.setBroadcast(true); 
     } 
      byte[] receivedata = new byte[1024]; 
     while (true) { 
     DatagramPacket recv_packet = new DatagramPacket(
     receivedata, receivedata.length); 
     clientsocket.receive(recv_packet); 
      alertMessage = new String(recv_packet.getData()); 
     InetAddress ipaddress = recv_packet.getAddress(); 
     int port = recv_packet.getPort(); 
     String msg = "RECEIVED UDP MSG FROM " + ipaddress.toString() + ":" + Integer.toString(port) + " :" + alertMessage; Log.d("UDP", msg); 
     myHandler.post(alertMsg); 
     } 
    } catch (Exception e) { 
     Log.e("UDP", "S: Error", e); 
    } 
     } 
}).start(); 

然後在一個單獨的類代碼可運行的任務,可以與主UI干擾。

final Runnable alertMsg = new Runnable() { 
    public void run() { 
     Toast.makeText(getApplicationContext(), alertMessage, Toast.LENGTH_LONG).show(); 
    } 
};