/
f1rment2
/
lab8
Обзор
Документация
Войти
/
f1rment2
/
lab8
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/LanDiscovery.java
85 строк
4 KB
Ilya
First commit: P2P Voice Chat with Multicast and Codec
02 июн 2026, 00:00
02 июн 2026, 00:00
ecd9191
Код
Авторство
О чём код?
import java.net.*; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class LanDiscovery { private static final String MULTICAST_ADDR = "230.0.0.1"; private static final int MULTICAST_PORT = 8888; private final String myNick; private final int myTcpPort; public final Map<String, String> onlineUsers = new ConcurrentHashMap<>(); private final Map<String, Long> lastSeen = new ConcurrentHashMap<>(); public LanDiscovery(String myNick, int myTcpPort) { this.myNick = myNick; this.myTcpPort = myTcpPort; } public void start() { // 1. Отправка анонсов (Анонсирование себя) new Thread(() -> { try (DatagramSocket socket = new DatagramSocket()) { InetAddress group = InetAddress.getByName(MULTICAST_ADDR); while (!Thread.currentThread().isInterrupted()) { String msg = "HELLO:" + myNick + ":" + myTcpPort; byte[] buf = msg.getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, group, MULTICAST_PORT); socket.send(packet); Thread.sleep(3000); } } catch (Exception e) { e.printStackTrace(); } }).start(); // 2. Прием анонсов (Слушатель сети) new Thread(() -> { try (MulticastSocket socket = new MulticastSocket(MULTICAST_PORT)) { InetAddress group = InetAddress.getByName(MULTICAST_ADDR); socket.joinGroup(group); byte[] buf = new byte[1024]; while (!Thread.currentThread().isInterrupted()) { DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); String msg = new String(packet.getData(), 0, packet.getLength()); if (msg.startsWith("HELLO:")) { String[] parts = msg.split(":"); String nick = parts[1]; int tcpPort = Integer.parseInt(parts[2]); String ip = packet.getAddress().getHostAddress(); if (!nick.equals(myNick)) { onlineUsers.put(nick, ip + ":" + tcpPort); lastSeen.put(nick, System.currentTimeMillis()); } } } } catch (Exception e) { e.printStackTrace(); } }).start(); // 3. Проверка Heartbeat (Очистка отключившихся) new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { long now = System.currentTimeMillis(); lastSeen.forEach((nick, time) -> { if (now - time > 15000) { onlineUsers.remove(nick); lastSeen.remove(nick); System.out.println("\n[Discovery] Пользователь " + nick + " покинул сеть."); } }); try { Thread.sleep(4000); } catch (InterruptedException e) { // Прерывание потока при выходе } } }).start(); } // Конец метода start() } // Конец класса LanDiscovery (Самая последняя скобка!)