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

Обмен WebSocket-сообщениями в Kotlin

Полный цикл в одной программе: сервер в фоне принимает строку и отвечает, клиент подключается, шлёт запрос и получает кадр в onMessage. Главный поток не должен завершиться раньше ответа.

Ожидание ответа удобно связать с CountDownLatch: счётчик сбрасывают в обработчике входящего текста, на main вызывают await. Печать ответа - обычный 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 fun main() { val ready = CountDownLatch(1) val done = CountDownLatch(1) val server = object : WebSocketServer( InetSocketAddress(0), ) { override fun onStart() { ready.countDown() } override fun onOpen( conn: WebSocket, handshake: ClientHandshake, ) {} override fun onClose( conn: WebSocket, code: Int, reason: String, remote: Boolean, ) {} override fun onMessage( conn: WebSocket, message: String, ) { conn.send("pong") } override fun onError( conn: WebSocket, ex: Exception, ) {} } server.start() ready.await() val port = server.port val uri = URI("ws://127.0.0.1:$port") val client = object : WebSocketClient(uri) { override fun onOpen( handshakedata: ServerHandshake, ) {} override fun onMessage(message: String) { println(message) done.countDown() } override fun onClose( code: Int, reason: String, remote: Boolean, ) {} override fun onError(ex: Exception) {} } 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 fun main() { val ready = CountDownLatch(1) val done = CountDownLatch(1) val server = object : WebSocketServer( InetSocketAddress(0), ) { override fun onStart() { ready.countDown() } override fun onOpen( conn: WebSocket, handshake: ClientHandshake, ) {} override fun onClose( conn: WebSocket, code: Int, reason: String, remote: Boolean, ) {} override fun onMessage( conn: WebSocket, message: String, ) { conn.send("done") } override fun onError( conn: WebSocket, ex: Exception, ) {} } server.start() ready.await() val port = server.port val uri = URI("ws://127.0.0.1:$port") val client = object : WebSocketClient(uri) { override fun onOpen( handshakedata: ServerHandshake, ) {} override fun onMessage(message: String) { println(message) done.countDown() } override fun onClose( code: Int, reason: String, remote: Boolean, ) {} override fun onError(ex: Exception) {} } client.connectBlocking() client.send("start job") done.await() client.close() server.stop() }

Отправьте "time" и выведите ответ "now" в консоли клиента.

Обменяйтесь фразами "ask" и "reply" в одном запуске. На экране должна появиться только строка ответа.

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