Не удается получить данные по сокету от устройства (в WLAN) через UDP - PullRequest
0 голосов
/ 18 октября 2011

мое устройство Android подключено к моей домашней беспроводной сети. Также к нему подключено специальное UDP-устройство. Мое приложение для Android успешно может отправлять команды на UDP-устройство. Но если я открою сокет, он не получит данные. Вы видите, что не так? Я знаю ip-адрес UDP-устройства из iphone-APP, который работает

Вот как приложение отправляет команды:

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 (пакета), который не получает данные. Из iphone и спецификации я знаю, что устройство отправляет данные через UDP 44445 через WLAN. Любые предложения, что не так? Спасибо!

Ответы [ 2 ]

1 голос
/ 18 октября 2011

UDP-порт 44445 используется протоколом eMule. Есть ли на вашем устройстве какие-либо другие активные клиенты eMule?

Обновление:

Проблема, похоже, связана с адресом, который вы привязываете - это должен быть адрес на локальном хосте, то есть IP-адрес вашего устройства, а не удаленного устройства. См. DatagramSocket(port, InetAddress) конструктор.

0 голосов
/ 18 октября 2011

Полагаю, вам нужно поместить функцию receive () в цикл while, поскольку ваш текущий код выглядит так, как будто он получает сообщение только один раз; он не гарантирует, что он будет содержать какие-либо действительные данные.

...