Несколько WebSocket-сообщений в Java
Пока соединение открыто, клиент может вызывать
send несколько раз подряд. Сервер получает
каждый кадр отдельным вызовом onMessage;
ответы тоже шлют по одному на кадр.
Приёмник на стороне сервера считает сообщения в
логике onMessage или накапливает счётчик.
Клиент ждёт нужное число ответов через
CountDownLatch:
import java.net.InetSocketAddress;
import java.net.URI;
import java.util.List;
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 received = new CountDownLatch(3);
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) {
System.out.println(message);
received.countDown();
}
@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 client = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake handshakedata) {}
@Override
public void onMessage(String message) {}
@Override
public void onClose(
int code,
String reason,
boolean remote
) {}
@Override
public void onError(Exception ex) {}
};
client.connectBlocking();
for (String word : List.of("one", "two", "three")) {
client.send(word);
}
received.await();
client.close();
server.stop();
}
}
Если сервер на каждый кадр отвечает строкой, клиент
снижает счётчик в 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 left = 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) {
conn.send("echo " + 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 client = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake handshakedata) {}
@Override
public void onMessage(String message) {
System.out.println(message);
left.countDown();
}
@Override
public void onClose(
int code,
String reason,
boolean remote
) {}
@Override
public void onError(Exception ex) {}
};
client.connectBlocking();
client.send("a");
client.send("b");
left.await();
client.close();
server.stop();
}
}
Даны сообщения:
var messages = List.of("n1", "n2", "n3", "n4", "n5");
Клиент отправляет их подряд. Сервер выводит пять строк по одной на кадр.
Примите три запроса и на каждый верните
"ok". Клиент выведет три строки
ответа.