【问题标题】:Ktor websocket client connected with more than one serverKtor websocket 客户端连接了多个服务器
【发布时间】:2021-06-19 05:06:43
【问题描述】:

所以我正在创建一个分布式键值数据存储并有一个代理来管理/查询。

这是我的客户:

     val client = HttpClient(CIO) {
         install(WebSockets)
     }

     runBlocking {
         client.ws(
             method = HttpMethod.Get,
             host = ip,
             port = port,
             path = "/thepath"
         ) {
              ...
         }
     }
        
     client.close()

到目前为止,我只能将一台服务器连接到客户端(显然是上面的代码)。

我尝试的是创建一个包含所有可用服务器的数组,然后随机选择一个并与代理(客户端)一起工作。但这仅适用于已连接的服务器,其他服务器应等到连接关闭。

        val clients: Array<HttpClient?> = arrayOfNulls(replicationFactor)
        for (i in 0 until replicationFactor) {
            clients[i] = HttpClient(CIO) {
                install(WebSockets)
            }
        }

        runBlocking {
            clients[0]?.ws(
                method = HttpMethod.Get,
                host = "some ip",
                port = the_port,
                path = "/thepath"
            ) {
               ....
            }

            ...
            ...
        }

关于如何解决这个问题的任何想法?也许我可以在单独的线程上保持与每个服务器的连接。

【问题讨论】:

    标签: kotlin websocket ktor


    【解决方案1】:

    您可以创建任意数量的 HTTP 客户端并将它们同时连接到服务器。这是一个例子:

    suspend fun main() {
        val clients = (0 until 3).map {
            HttpClient(CIO) {
                install(WebSockets)
            }
        }
    
        val connections = coroutineScope {
            clients.mapIndexed { index, client ->
                async {
                    client.ws("wss://echo.websocket.org") {
                        outgoing.send(Frame.Text("Hello server"))
    
                        incoming.consumeEach { frame ->
                            if (frame is Frame.Text) {
                                println("[$index] Server replied ${frame.readText()}")
                            }
                        }
                    }
                }
            }.toTypedArray()
        }
    
        awaitAll(*connections)
    }
    

    【讨论】:

    • 那太好了,你的回答让我很好地了解了我所缺少的东西。我试图在主线程上连接我的所有服务器,这就是问题所在。
    • 只是一个理论问题。以后可以以某种方式单独使用这些连接。例如,将某些内容发送到 Server1,然后再发送到 Server3,然后再发送到 Server3。不是我需要它,只是好奇,因为我对协程了解不多
    • 是的,你可以单独使用它们,但是如果你想强制发送一些顺序,那么你需要某种同步机制。
    • 是的,我读过一些关于整理协程的东西。不管怎么说,还是要谢谢你。祝你有美好的一天
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2021-08-17
    • 2020-09-13
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多