2011-10-18 164 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