如何使用http4k实现websocket广播?

时间:2019-04-30 16:45:39

标签: kotlin websocket broadcast http4k

我正在使用http4k websocket构建一个小型的websocket应用,并且似乎没有关于如何使用它实现消息广播的文档( ie 对将其发送给所有客户端(发送邮件的客户端除外)。有可能吗?

1 个答案:

答案 0 :(得分:1)

如果问题是“ http4k是否随整个分布式消息传递平台一起提供”,则答案是否定的:)。但是,如果只希望有一个消息传递节点来跟踪内存中的所有消息和已连接的Websocket,那么这很简单。

此代码改编自http4k demo project,该代码在30行Kotlin中实现了聊天服务器:

fun IrcApp(): PolyHandler {
    val userCounter = AtomicInteger()
    val participants = ConcurrentHashMap<String, Websocket>()

    fun newConnection(ws: Websocket) {
        val id = "user${userCounter.incrementAndGet()}"
        participants += id to ws
        ws.onMessage { new ->
            participants.values
                .filterNot { it == ws }
                .forEach { it.send(WsMessage("$id: ${new.bodyString()}")) }
        }
        ws.onClose {
            participants -= id
        }
    }

    return PolyHandler(
        static(ResourceLoader.Classpath()),
        websockets("/ws" bind ::newConnection)
    )
}