Рассылка по 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. В консоли каждого должна появиться
эта строка.