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

Несколько WebSocket-сообщений в Kotlin

Пока соединение открыто, клиент может вызывать send несколько раз подряд. Сервер получает каждый кадр отдельным вызовом onMessage; ответы тоже шлют по одному на кадр.

Приёмник на стороне сервера считает сообщения в цикле логики onMessage или накапливает счётчик. Клиент ждёт нужное число ответов через CountDownLatch:

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 received = CountDownLatch(3) 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, ) { println(message) received.countDown() } 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) {} override fun onClose( code: Int, reason: String, remote: Boolean, ) {} override fun onError(ex: Exception) {} } client.connectBlocking() for (word in listOf("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 fun main() { val ready = CountDownLatch(1) val left = CountDownLatch(2) 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("echo $message") } 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) left.countDown() } override fun onClose( code: Int, reason: String, remote: Boolean, ) {} override fun onError(ex: Exception) {} } client.connectBlocking() client.send("a") client.send("b") left.await() client.close() server.stop() }

Передайте пять кадров с текстами "n1" … "n5". Сервер выведет пять строк по одной на кадр.

Примите три запроса и на каждый верните "ok". Клиент выведет три строки ответа.

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