使用说明

主要源码如下

package top.yunp

import com.google.gson.Gson
import io.ktor.server.application.*
import io.ktor.server.routing.*
import io.ktor.server.websocket.*
import io.ktor.websocket.*
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.launch
import kotlin.time.Duration.Companion.seconds

private val GSON = Gson()

fun Application.configureSockets() {
    install(WebSockets) {
        pingPeriod = 15.seconds
        maxFrameSize = Long.MAX_VALUE
        masking = false
    }
    routing {
        webSocket("/ws") { // websocketSession

            val broadcastReceiverJob = launch {
                ConnectionsKeeper.broadcastSharedFlow.asSharedFlow().collect { message ->
                    send(message)
                }
            }

            var currentUser = "未知用户"

            for (frame in incoming) {
                if (frame is Frame.Text) {
                    val text = frame.readText()
                    val message = GSON.fromJson(text, Message::class.java)
                    if (message.type == "login") {
                        currentUser = message.username
                    }
                    ConnectionsKeeper.broadcastSharedFlow.emit(text)
                }
            }

            broadcastReceiverJob.cancel()
            ConnectionsKeeper.broadcastSharedFlow.emit(
                GSON.toJson(
                    Message(
                        type = "logout",
                        username = currentUser,
                        content = ""
                    )
                )
            )
        }
    }
}