2011-10-18 140 views
0

我的android設備已連接到我的家庭無線網絡。還有一個特殊的UDP設備連接到它。我的android應用成功可以發送命令給UDP設備。但是,如果我打開一個套接字它不會收到數據。你能看到什麼是錯的嗎?我知道從iphone-APP的UDP-設備中的哪一個工作無法通過UDP從設備(在WLAN中)通過套接字接收數據

下面是如何應用程序發送指令的IP:

public static final String SERVERIP = "192.168.2.114"; 
public static final int PORT = 44444; 
public void run() { 
    try { 
     serverAddr = InetAddress.getByName(SERVERIP); 
     DatagramSocket socket = new DatagramSocket(); 
     byte[] buf = message.toByteArray(); 
     DatagramPacket packet = new DatagramPacket(buf, buf.length,  serverAddr, PORT); 
     socket.send(packet); 
     socket.close(); 
    } catch (Exception e) { 
     Log.e("UDP", "Sender/Client: Error", e); 
    } 
} 

雖然我有用於接收數據的兩種方法:

public static final String SERVERIP = "192.168.2.114"; 
public static final int SERVERPORT = 44445; 

private InetAddress serverAddr; 

public void run() { 
    try { 
     InetAddress serverAddr = InetAddress.getByName(SERVERIP); 
     DatagramSocket socket = new DatagramSocket(SERVERPORT, serverAddr); 
     byte[] buf = new byte[65213]; 
     DatagramPacket packet = new DatagramPacket(buf, buf.length); 
     socket.receive(packet); 
    } catch (Exception e) { 
     Log.e("UDP", "Receiver: Error", e); 
    } 

    try { 
     serverAddr = InetAddress.getByName(SERVERIP); 
     DatagramChannel channel = DatagramChannel.open(); 
     DatagramSocket socket = channel.socket(); 
     byte[] buf = new byte[65213]; 
     DatagramPacket packet = new DatagramPacket(buf, buf.length,  serverAddr, SERVERPORT); 
     socket.receive(packet); 
     socket.close(); 
    } catch (Exception e) { 
     Log.e("UDP", "Sender/Client: Error", e); 
    } 
} 

在第一個try塊的方法導致的異常:

java.net.BindException: Cannot assign requested address 
at org.apache.harmony.luni.platform.OSNetworkSystem.bind(Native Method) 
at dalvik.system.BlockGuard$WrappedNetworkSystem.bind(BlockGuard.java:268) 
at org.apache.harmony.luni.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:81) 
at java.net.DatagramSocket.createSocket(DatagramSocket.java:193) 
at java.net.DatagramSocket.<init>(DatagramSocket.java:95) 
at de.myappname.connection.Receiver.run(Receiver.java:29) 
at java.lang.Thread.run(Thread.java:1019) 

第二AP proach只是通過不接收數據的socket.receive(packet)阻塞線程。從iPhone和規格我知道該設備通過無線局域網上的UDP 44445發送數據。任何建議有什麼不對? 謝謝!

+0

終於在這裏找到了解決方案:http://code.google.com/p/boxeeremote/wiki/AndroidUDP – softwaresupply

回答

0

我想你需要把receive()函數放在while循環中,因爲你現在的代碼看起來像只接收一次消息;它不保證它將包含任何有效的數據。

+0

我把它放在while循環中,但仍然是命令阻塞,所以循環甚至沒有得到在第二次迭代中。 – softwaresupply

1

eMule協議使用UDP端口44445。您的設備上是否有其他eMule客戶端處於活動狀態?

更新:

的問題似乎是綁定到地址 - 它必須是在本地主機地址,即設備的IP地址,而不是遠程設備。請參閱DatagramSocket(port, InetAddress)構造函數。

+0

已編輯 - 似乎IP地址有問題。 –

+0

其實我殺死了taskkiler中的所有應用程序。沒有應用可能會聽到44445. IP地址可能有什麼錯誤?特別是當發送數據正在工作時。 – softwaresupply

+0

好的,那麼我能做些什麼來接收來自192.168.2.114上UDP設備的數據呢?爲什麼綁定工作,當我發送數據呢? – softwaresupply