Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpWsBrc 320 of 322 menu
◀ ▶

Рассылка по WebSocket в Java

Когда одно уведомление должны получить все подписчики, сервер шлёт один кадр каждому открытому соединению. Для этого у типа сервера есть метод broadcast - ответ не привязан к одному onMessage.

Два клиента подключаются к одному порту на 127.0.0.1; после рукопожатия сервер вызывает broadcast. Каждый клиент получает строку в своём onMessage:

import java.net.InetSocketAddress; import java.net.URI; import java.util.concurrent.CountDownLatch; import org.java_websocket.WebSocket; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.handshake.ServerHandshake; import org.java_websocket.server.WebSocketServer; public class Main { public static void main(String[] args) throws Exception { CountDownLatch ready = new CountDownLatch(1); CountDownLatch got = new CountDownLatch(2); WebSocketServer server = new WebSocketServer( new InetSocketAddress(0) ) { @Override public void onStart() { ready.countDown(); } @Override public void onOpen( WebSocket conn, ClientHandshake handshake ) {} @Override public void onClose( WebSocket conn, int code, String reason, boolean remote ) {} @Override public void onMessage(WebSocket conn, String message) {} @Override public void onError(WebSocket conn, Exception ex) {} }; server.start(); ready.await(); int port = server.getPort(); URI uri = URI.create("ws://127.0.0.1:" + port); WebSocketClient first = makeClient(uri, got); WebSocketClient second = makeClient(uri, got); first.connectBlocking(); second.connectBlocking(); server.broadcast("news"); got.await(); first.close(); second.close(); server.stop(); } private static WebSocketClient makeClient( URI uri, CountDownLatch got ) { return new WebSocketClient(uri) { @Override public void onOpen(ServerHandshake handshakedata) {} @Override public void onMessage(String message) { System.out.println(message); got.countDown(); } @Override public void onClose( int code, String reason, boolean remote ) {} @Override public void onError(Exception ex) {} }; } }

Текст рассылки может быть любым на английском. Главное - дождаться подключения всех клиентов, затем один раз вызвать broadcast:

import java.net.InetSocketAddress; import java.net.URI; import java.util.concurrent.CountDownLatch; import org.java_websocket.WebSocket; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.handshake.ServerHandshake; import org.java_websocket.server.WebSocketServer; public class Main { public static void main(String[] args) throws Exception { CountDownLatch ready = new CountDownLatch(1); CountDownLatch got = new CountDownLatch(2); WebSocketServer server = new WebSocketServer( new InetSocketAddress(0) ) { @Override public void onStart() { ready.countDown(); } @Override public void onOpen( WebSocket conn, ClientHandshake handshake ) {} @Override public void onClose( WebSocket conn, int code, String reason, boolean remote ) {} @Override public void onMessage(WebSocket conn, String message) {} @Override public void onError(WebSocket conn, Exception ex) {} }; server.start(); ready.await(); int port = server.getPort(); URI uri = URI.create("ws://127.0.0.1:" + port); WebSocketClient first = makeClient(uri, got); WebSocketClient second = makeClient(uri, got); first.connectBlocking(); second.connectBlocking(); server.broadcast("alert"); got.await(); first.close(); second.close(); server.stop(); } private static WebSocketClient makeClient( URI uri, CountDownLatch got ) { return new WebSocketClient(uri) { @Override public void onOpen(ServerHandshake handshakedata) {} @Override public void onMessage(String message) { System.out.println(message); got.countDown(); } @Override public void onClose( int code, String reason, boolean remote ) {} @Override public void onError(Exception ex) {} }; } }

Подключите два клиента и доставьте обоим строку "sync" одним вызовом на сервере.

Разошлите "ready" двум клиентам на localhost. В консоли каждого должна появиться эта строка.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить