使用说明
主要源码如下
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 = ""
)
)
)
}
}
}