java - 无法通过 UDP 通过套接字从设备(在 WLAN 中)接收数据

标签 java android sockets udp wifi

我的 Android 设备已连接到我的家庭无线网络。还连接了一个特殊的 UDP 设备。我的 Android 应用程序可以成功向 UDP 设备发送命令。但是,如果我打开套接字,它不会接收数据。你能看出哪里出了问题吗?我从正在运行的 iphone 应用程序中知道 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 block 中的方法会导致异常:

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 和规范中我知道该设备通过 UDP 44445 通过 WLAN 发送数据。有什么建议吗?有什么问题吗? 谢谢!

最佳答案

UDP 端口 44445 由 eMule 协议(protocol)使用。您的设备上还有其他活跃的 eMule 客户端吗?

更新:

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

关于java - 无法通过 UDP 通过套接字从设备(在 WLAN 中)接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7807740/

相关文章:

java - C++ 中 BufferedImage 的替代

java - 在 Android 应用程序中将原始图像替换为新图像

java - 尽管文件位于同一目录中,但无法打开文件进行读取

android - Google Play APK 扩展下载器库坏了?

android - 预配对蓝牙设备

android - Facebook 连接 android 以获取我的电子邮件地址?

用于聊天应用程序的 Java nat 遍历

java - 不知从何而来的方法?

linux - ss命令输出说明(进程描述中第3个数字)

java - 编写 java.net.SocketImplFactory