Рассылка по 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. В консоли каждого должна появиться
эта строка.