проблема передачи Java UDP - PullRequest
1 голос
/ 08 апреля 2011

У меня проблема с поведением широковещательной передачи udp,

public static final int PORT = 34567;

public static void main(String[] args) throws IOException,
        InterruptedException {
    if (args.length > 0 && args[0].equals("server")) {
        int port;
        if (args.length >= 2) {
            port = Integer.parseInt(args[1]);
        } else {
            port = PORT;
        }

        DatagramSocket sr = new DatagramSocket(port, InetAddress.getLocalHost());

        while (true) {
            byte[] buf = new byte[256];
            DatagramPacket pct = new DatagramPacket(buf, buf.length);
            sr.receive(pct);
            String s = new String(buf);
            System.out.println(s.replaceAll("\0", "") + " " + pct.getAddress().toString());
        }
    } else {
        DatagramSocket ss = new DatagramSocket();
        ss.setBroadcast(true);
        byte[] b = new byte[100];
        DatagramPacket p = new DatagramPacket(b, b.length);
        p.setAddress(InetAddress.getByAddress(new byte[] { (byte) 255,
                (byte) 255, (byte) 255, (byte) 255 }));
        p.setPort(PORT);

        int i = 0;
        while (true) {
            String s = new Integer(i++).toString();
            System.out.println(s);
            b = s.getBytes();
            p.setData(b);
            ss.send(p);
            Thread.sleep(1000);
        }

на машине A, когда я запускаю и сервер, и клиент, он получает несколько пакетов одновременно, поэтому я получаю следующий вывод

0 /192.168.253.5
0 /192.168.253.5
1 /192.168.253.5
1 /192.168.253.5
2 /192.168.253.5
2 /192.168.253.5

на другой машине B, когда я делаю то же самое, сервер вообще не получает пакетов

, когда я запускаю клиент на машине A и сервер на машине B, сервер получает пакеты

, когда язапустить сервер на машине A и клиент на машине B, сервер не получает пакетов

Я полагаю, что это зависит от локального адреса отправляющего сокета udp, так как каждая машина подключена к нескольким сетям, а локальный адресвыбран случайным образом (верно ли это?), и он только отправляет широковещательные сообщения в сеть, к которой принадлежит локальный адрес, верно?

, если это так, как я могу отправлять широковещательные рассылки во все сети, к которым подключен ПК?и почему получено несколько одинаковых пакетов (первый случай)

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

DatagramSocket sr = new DatagramSocket (порт, InetAddress.getLocalHost ()); * +1002 *

Измените этот второй аргумент на ноль или пропустите его. Вам все равно, с какого IP-адреса вы получаете дейтаграммы.

p.setAddress (InetAddress.getByAddress (новый байт [] {(байт) 255, (байт) 255, (байт) 255, (байт) 255}));

Трансляция на 255.255.255.255 устарела уже около 20 лет. Используйте специфический для подсети широковещательный адрес. Еще лучше, исследовать многоадресную рассылку.

1 голос
/ 08 апреля 2011

UDP-запросы часто ограничены текущей подсетью (если только вы не проходите через шлюз, что является необычным). Так что это одна проблема.

Машина, не получающая никаких запросов UDP, также может иметь локальный брандмауэр, который также блокирует ее.

...