Server Socket
The ServerSocket interface allows you to listen for inbound TCP connections. Accepted connections are emitted as a Flow<ClientToServerSocket>.
Basic Usage
val server = ServerSocket.allocate()
val clients: Flow<ClientToServerSocket> = server.bind()
launch {
clients.collect { client ->
// Handle each connected client
val message = client.readString()
client.writeString("Echo: $message")
client.close()
}
}
Binding Options
val server = ServerSocket.allocate()
val clients = server.bind(
port = 8080, // specific port, or use default for OS-assigned
backlog = 128, // max pending connections
)
Server State
val isListening: Boolean = server.isListening()
val port: Int = server.port() // -1 if not bound
Closing
server.close() // stops accepting new connections
Echo Server
val server = ServerSocket.allocate()
val clients = server.bind()
launch {
clients.collect { client ->
val data = client.readString()
client.writeString(data)
client.close()
}
}
// Test with a client
val client = ClientSocket.connect(server.port())
client.writeString("Hello!")
assertEquals("Hello!", client.readString())
client.close()
server.close()
Streaming Echo Server
An echo server that streams lines back to each client:
val server = ServerSocket.allocate()
val clients = server.bind(port = 9000)
clients.collect { client ->
launch {
client.readFlowLines().collect { line ->
client.writeString("Echo: $line\n")
}
client.close()
}
}