Coverage Summary for Class: Server (dev.suresh.vthread.echo)

Class Class, % Method, % Branch, % Line, % Instruction, %
Server 0% (0/1) 0% (0/6) 0% (0/4) 0% (0/26) 0% (0/215)


 package dev.suresh.vthread.echo
 
 import java.net.*
 import java.net.StandardSocketOptions.SO_REUSEADDR
 import java.net.StandardSocketOptions.SO_REUSEPORT
 import java.time.*
 import java.util.concurrent.atomic.*
 import kotlinx.datetime.*
 import kotlinx.datetime.Clock
 
 object Server {
   val ports = 9001..9010
   private val conns = LongAdder()
   private val msgs = LongAdder()
 
   fun run() {
     println("Starting echo server on ports range: $ports")
     ports.forEach { port -> Thread.startVirtualThread { serve(port) } }
 
     while (true) {
       Thread.sleep(Duration.ofSeconds(2))
       val currDateTime = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault())
       println("$currDateTime - Connections: ${conns.sum()}, Messages: ${msgs.sum()}")
     }
   }
 
   fun serve(port: Int) {
     ServerSocket(port, 1_000, InetAddress.getByName("0.0.0.0")).use { server ->
       server.setOption(SO_REUSEADDR, true)
       server.setOption(SO_REUSEPORT, true)
       while (true) {
         val client = server.accept()
         conns.increment()
         Thread.startVirtualThread { handle(client) }
       }
     }
   }
 
   fun handle(socket: Socket) {
     try {
       socket.use { sock ->
         val inr = sock.inputStream.bufferedReader()
         val out = sock.outputStream.bufferedWriter()
         inr.forEachLine {
           msgs.increment()
           out.write(it)
           out.newLine()
         }
       }
     } finally {
       conns.decrement()
     }
   }
 }
 
 fun main() {
   Server.run()
 }