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

Рассылка по WebSocket в Kotlin

У WebSocketServer есть метод broadcast: он доставляет один текстовый кадр каждому открытому соединению. Это удобно для уведомлений, когда адресатов несколько и ответ не привязан к одному onMessage.

Два клиента подключаются к одному порту на 127.0.0.1; после рукопожатия сервер вызывает broadcast. Каждый клиент получает строку в своём 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 got = 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, ) {} override fun onError( conn: WebSocket, ex: Exception, ) {} } server.start() ready.await() val port = server.port val uri = URI("ws://127.0.0.1:$port") fun makeClient(): WebSocketClient { return object : WebSocketClient(uri) { override fun onOpen( handshakedata: ServerHandshake, ) {} override fun onMessage(message: String) { println(message) got.countDown() } override fun onClose( code: Int, reason: String, remote: Boolean, ) {} override fun onError(ex: Exception) {} } } val first = makeClient() val second = makeClient() first.connectBlocking() second.connectBlocking() server.broadcast("news") got.await() first.close() second.close() server.stop() }

Текст рассылки может быть любым на английском. Главное - дождаться подключения всех клиентов, затем один раз вызвать broadcast:

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 got = 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, ) {} override fun onError( conn: WebSocket, ex: Exception, ) {} } server.start() ready.await() val port = server.port val uri = URI("ws://127.0.0.1:$port") fun makeClient(): WebSocketClient { return object : WebSocketClient(uri) { override fun onOpen( handshakedata: ServerHandshake, ) {} override fun onMessage(message: String) { println(message) got.countDown() } override fun onClose( code: Int, reason: String, remote: Boolean, ) {} override fun onError(ex: Exception) {} } } val first = makeClient() val second = makeClient() first.connectBlocking() second.connectBlocking() server.broadcast("alert") got.await() first.close() second.close() server.stop() }

Подключите два клиента и доставьте обоим строку "sync" одним вызовом на сервере.

Разошлите "ready" двум клиентам на localhost. В консоли каждого должна появиться эта строка.

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