【问题标题】:Cannot receive data by a socket from a device (in WLAN) via UDP无法通过 UDP 通过套接字从设备(在 WLAN 中)接收数据
【发布时间】:2011-10-18 13:11:22
【问题描述】:

我的 android 设备已连接到我的家庭无线网络。还有一个特殊的 UDP 设备连接到它。我的 android 应用程序成功地可以向 UDP 设备发送命令。但是如果我打开一个套接字,它就不会接收数据。你能看出有什么问题吗?我从正在工作的 iphone-APP 知道 UDP 设备的 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)

第二种方法只是通过不接收数据的 socket.receive(packet) 阻塞线程。从 iphone 和规范中,我知道该设备通过 WLAN 上的 UDP 44445 发送数据。有什么建议有什么问题吗? 谢谢!

【问题讨论】:

标签: java android sockets udp wifi


【解决方案1】:

UDP 端口 44445 被 eMule 协议使用。您的设备上是否还有其他处于活动状态的 eMule 客户端?

更新:

问题似乎是您绑定到的地址 - 它必须是本地主机上的地址,即您的设备的 IP 地址,而不是远程设备。见DatagramSocket(port, InetAddress)构造函数。

【讨论】:

  • 已编辑 - IP 地址似乎有问题。
  • 实际上我在那里杀死了taskkiler中的所有应用程序。没有可以通过 44445 监听的应用程序。IP 地址可能有什么问题?尤其是在发送数据正常时。
  • 好的,那么我该怎么做才能从 192.168.2.114 上的 UDP 设备接收数据?为什么我发送数据时绑定有效?
【解决方案2】:

我猜你需要将 receive() 函数放在一个 while 循环中,因为你当前的代码看起来只接收一次消息;它不保证它将包含任何有效数据。

【讨论】:

  • 我把它放在一个while循环中,但命令仍然阻塞,所以循环甚至没有进入第二次迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多