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

Обмен 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" в одном запуске. На экране должна появиться только строка ответа.

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