Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Ktor websocket客户端与多台服务器连接_Kotlin_Websocket_Ktor - Fatal编程技术网

Kotlin Ktor websocket客户端与多台服务器连接

Kotlin Ktor websocket客户端与多台服务器连接,kotlin,websocket,ktor,Kotlin,Websocket,Ktor,因此,我正在创建一个分布式键值数据存储,并有一个代理来管理/查询 这是我的客户: val client = HttpClient(CIO) { install(WebSockets) } runBlocking { client.ws( method = HttpMethod.Get, host = ip, port = port,

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

这是我的客户:

     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"
            ) {
               ....
            }

            ...
            ...
        }

val客户端:Array=arrayOfNulls(复制因子)
for(0中的i直到replicationFactor){
客户机[i]=HttpClient(CIO){
安装(WebSocket)
}
}
运行阻塞{
客户端[0]?.ws(
method=HttpMethod.Get,
host=“某些ip”,
端口=_端口,
path=“/thepath”
) {
....
}
...
...
}

有没有办法解决这个问题?也许我可以在一个单独的线程上保持与每个服务器的连接。

您可以创建任意数量的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)
}

太好了,伙计,你的回答让我很清楚我错过了什么。我试图在主线程上连接所有服务器,这就是问题所在。这只是一个理论问题。可以在以后以某种方式单独使用这些连接。例如,先将内容发送到服务器1,然后发送到服务器3,再发送到服务器3。不是我需要它,只是好奇,因为我对协同程序不太了解是的,你可以单独使用它们,但是如果你想强加某种发送顺序,那么你需要某种同步机制。是的,我读了一些关于将协同程序按顺序排列的内容。无论如何,谢谢你。祝你今天愉快