UDP Broadcast на Java - PullRequest
       56

UDP Broadcast на Java

6 голосов
/ 01 июня 2010

Утро.

Я довольно новичок в Java и сокетных соединениях, но я пытаюсь отправить пакет UDP / широковещательную рассылку 255.255.255.255 на порт 8001 на устройство. Я могу получить данные для отправки просто отлично, однако, когда приходит время получать данные, время соединения истекает. У меня есть анализатор пакетов, и я вижу отправку пакета, а затем устройство отвечает.

Я почти уверен, что это ошибка новичка, которую я пропустил в своем коде, но я застрял на нем некоторое время, и любая помощь будет признательна.

 m_Socket = new DatagramSocket(m_SERVERPORT);
 InetAddress address = InetAddress.getByName(m_SERVERIP);


 m_DataPack = new DatagramPacket(m_SERVERCMD.getBytes(), m_SERVERCMD.getBytes().length,
 address, m_SERVERPORT);
 m_Socket.setBroadcast(true);
 m_Socket.connect(address, m_SERVERPORT);

 m_Socket.send(m_DataPack);
 m_DataPack = new DatagramPacket(data, data.length,
 address, m_SERVERPORT);


 m_Socket.receive(m_DataPack); // This is where it times out


 data = m_DataPack.getData();
 String received = data.toString();
 System.out.println("Received: " + received);
 m_Socket.close();

Спасибо и Gig'Em.

EDIT:

Я не уверен, помогает ли это, но когда я смотрю объект m_Socket, я могу видеть следующее прямо перед отправкой:

bound = true;
close = false;
connectedAddress = Inet4Address (id = 32) (-1,-1,-1,-1);
connectedPort = 8001;
connectState = 1;
created = true;
impl = PlainDatagramSocketImpl;
oldImpl = false;

и объект m_DataPack имеет следующий вид:

address = Inet4Address (id = 32) (-1,-1,-1,-1);
bufLength = 6 (size of packet I'm sending is 6 char long);
offset = 0;
port = 8001;

Ответы [ 4 ]

11 голосов
/ 02 июня 2010

Это не имеет смысла. Вы вещаете 1-ко-многим, и вы также подключаетесь, то есть 1-к-1. Что это?

Потерять связь. И потерять 255.255.255.255. Это сильно устарело в течение 20 лет. Используйте локальный широковещательный адрес подсети, например, 192.168.1.255.

3 голосов
/ 16 февраля 2012

Вы также можете взглянуть на MulticastSocket, описанный в Вещание нескольким получателям . Надеюсь, это поможет.

1 голос
/ 01 июня 2010

Если вы хотите получить дейтаграмму, вам нужно bind () с локальной конечной точкой (адрес + порт).

0 голосов
/ 24 июля 2018

Вы отправляете и получаете пакет на одном устройстве. Вы можете разделить порты отправки и получения (например, отправить на 8001, получить на 8002). И запустить отправлять и получать коды в виде отдельных потоков. Если оба устройства должны найти друг друга (или одно устройство может найти себя).

import java.io.IOException;
import java.net.*;

Принимающий:

private DatagramSocket getReceiveSocket() throws UnknownHostException, SocketException {
    if (receiveSocket == null) {
        receiveSocket = new DatagramSocket(8002, InetAddress.getByName("0.0.0.0")); // 0.0.0.0 for listen to all ips
        receiveSocket.setBroadcast(true);
    }
    return receiveSocket;
}

public void receive() throws IOException {
    // Discovery request command
    byte[] buffer = "__DISCOVERY_REQUEST__".getBytes();
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    getReceiveSocket().receive(packet);
    System.out.println("Discovery package received! -> " + packet.getAddress() + ":" + packet.getPort());
    // Get received data
    String data = new String(packet.getData()).trim();
    if (data.equals("__DISCOVERY_REQUEST__")) { // validate command
        // Send response
        byte[] response = new byte["__DISCOVERY_RESPONSE".length()];
        DatagramPacket responsePacket = new DatagramPacket(response, response.length, packet.getAddress(), packet.getPort());
        getReceiveSocket().send(responsePacket);
        System.out.println("Response sent to: " + packet.getAddress() + ":" + packet.getPort());
    } else {
        System.err.println("Error, not valid package!" + packet.getAddress() + ":" + packet.getPort());
    }
}

Отправка:

private DatagramSocket getSendSocket() throws UnknownHostException, SocketException {
    if (sendSocket == null) {
        sendSocket = new DatagramSocket(8001, InetAddress.getLocalHost());
        sendSocket.setBroadcast(true);
    }
    return sendSocket;
}

public void send() throws IOException {
    // Discovery request command
    byte[] data = "__DISCOVERY_REQUEST__".getBytes();
    DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("255.255.255.255"), 8002);
    getSendSocket().send(packet);
    System.out.println("Discovery package sent!" + packet.getAddress() + ":" + packet.getPort());

    // Discovery response command
    byte[] response = new byte["__DISCOVERY_RESPONSE__".length()];
    DatagramPacket responsePacket = new DatagramPacket(response, response.length);
    getSendSocket().receive(responsePacket);
    System.out.println("Discovery response received!" + responsePacket.getAddress() + ":" + responsePacket.getPort());
    String responseData = new String(responsePacket.getData()).trim();
    if (responseData.equals("__DISCOVERY_RESPONSE__")) { // Check valid command
        System.out.println("Found buddy!" + responsePacket.getAddress() + ":" + responsePacket.getPort());
    }
}

Конечно, этот код следует поместить в цикл в потоке. На основании этого примера: https://demey.io/network-discovery-using-udp-broadcast/

UPDATE

Ссылка выше не работает. Но тот же метод, описанный здесь также: https://www.baeldung.com/java-broadcast-multicast

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...