Java одноранговый чат UDP
Я новичок в программировании сокетов Java, и в настоящее время я занимаюсь разработкой небольшого однорангового приложения для UDP-чата, которое позволяет нескольким клиентам общаться друг с другом.
У меня вопрос: как заставить клиента обнаруживать все остальные подключенные клиенты, когда он нажимает кнопку подключения, предоставляя только один из ip и порта подключенных клиентов? Программа работает только в локальной сети.
3 ответа
Вы можете использовать уникальную функцию UDP, которая вещает
На IPv4 (который вы, вероятно, используете) адрес для вещания - 255.255.255.255. Любая датаграмма, отправленная на этот адрес, будет отправлена всем UDP-клиентам в сети для этого порта.
Что вы можете сделать для своего приложения чата, это чтобы каждый клиент отправлял пакет в широковещательную рассылку UDP, идентифицируя себя, например, псевдоним пользователя. Все остальные клиенты увидят этот пакет, и вы сможете проанализировать пакет и отобразить список всех клиентов чата в сети.
Вот пример отправки дейтаграммы для трансляции:
DatagramSocket s = new DatagramSocket();
s.setBroadcast(true);
DatagramPacket dp = new DatagramPacket("insert data here".getBytes(), "insert data here".length(), new InetSocketAddress("255.255.255.255", 5000));
s.send(dp);
Другой клиент может получить это так:
DatagramSocket s = new DatagramSocket();
s.setBroadcast(true);
DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
s.receive(dp);
Полученный DatagramPacket будет содержать IP-адрес и порт клиента, который его передал.
Одна простая возможность состоит в том, что каждый клиент хранит других известных ему пиров и передает список любым новым подключающимся клиентам.
Не забывайте аутентифицировать своих сверстников. Вы можете попробовать использовать OpenSSL (очень просто), чтобы сгенерировать некоторые сертификаты и использовать его вместе с ssl.