Несколько 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". Клиент выведет три строки
ответа.