import lyng.io.net val host = "127.0.0.1" val clientCount = 1000 val server: TcpServer = Net.tcpListen(0, host, clientCount, true) as TcpServer val port: Int = server.localAddress().port fun payloadFor(index: Int): String { "$index:${Random.nextInt()}:${Random.nextInt()}" } fun handleClient(client: TcpSocket): String { try { val source = client.readLine() if( source == null ) { return "server-eof" } val reply = "pong: $source" client.writeUtf8(reply + "\n") client.flush() reply } finally { client.close() } } val serverJob: Deferred = launch { var handlers: List = List() try { for( i in 0..<1000 ) { val client: TcpSocket = server.accept() as TcpSocket handlers += launch { handleClient(client) } } handlers.joinAll() } finally { server.close() } } val clientJobs: List = (0.. val payload = payloadFor(index) launch { val socket: TcpSocket = Net.tcpConnect(host, port) as TcpSocket try { socket.writeUtf8(payload + "\n") socket.flush() val reply = socket.readLine() if( reply == null ) { "client-eof:$payload" } else { assertEquals("pong: $payload", reply) reply } } finally { socket.close() } } } val replies = clientJobs.joinAll() val serverReplies = serverJob.await() as List assertEquals(clientCount, replies.size) assertEquals(clientCount, serverReplies.size) assertEquals(replies.toSet, serverReplies.toSet) val summary = "OK: $clientCount concurrent tcp clients" println(summary) summary