Обмен WebSocket-сообщениями в Java
Полный цикл в одной программе: сервер в фоне
принимает строку и отвечает, клиент подключается,
шлёт запрос и получает кадр в onMessage.
Главный поток не должен завершиться раньше ответа.
Ожидание ответа удобно связать с
CountDownLatch: счётчик сбрасывают в
обработчике входящего текста, на main
вызывают await. Печать ответа -
обычный System.out.println:
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 done = new CountDownLatch(1);
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("pong");
}
@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);
done.countDown();
}
@Override
public void onClose(
int code,
String reason,
boolean remote
) {}
@Override
public void onError(Exception ex) {}
};
client.connectBlocking();
client.send("ping");
done.await();
client.close();
server.stop();
}
}
Тот же каркас подходит для других коротких фраз. Сервер может подставить фиксированный ответ, не зависящий от текста запроса:
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 done = new CountDownLatch(1);
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("done");
}
@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);
done.countDown();
}
@Override
public void onClose(
int code,
String reason,
boolean remote
) {}
@Override
public void onError(Exception ex) {}
};
client.connectBlocking();
client.send("start job");
done.await();
client.close();
server.stop();
}
}
Отправьте "time" и выведите ответ
"now" в консоли клиента.
Обменяйтесь фразами "ask" и
"reply" в одном запуске. На экране
должна появиться только строка ответа.