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。不是我需要它,只是好奇,因为我对协同程序不太了解是的,你可以单独使用它们,但是如果你想强加某种发送顺序,那么你需要某种同步机制。是的,我读了一些关于将协同程序按顺序排列的内容。无论如何,谢谢你。祝你今天愉快