package Ġgather . server Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . channels . Receive Channel Ċ import Ġkotlinx . coroutines . channels . produce Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . Server Socket Ċ import Ġjava . net . Socket Exception Ċ Ċ /** Ċ Ġ* Ġ ĠCreates Ġa Ġserver Ġat Ġlocal Ġhost Ġwith Ġthe Ġgiven Ġ@ param Ġport Ċ Ġ*/ Ċ fun Ġcreate Server ( port : ĠInt ) Ġ= ĠServer Socket ( port , Ġ 5 0 , ĠInet Address . get ByName (" localhost ")) Ċ Ċ /** Ċ Ġ* Ġaccepts Ġsockets Ġfrom Ġserver Ġand Ġredirects Ġbody Ċ Ġ* Ġof Ġthe Ġresponse Ġto Ġthe Ġreturned Ġ[ Receive Channel ] Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ @ Suppress (" Blocking Method In Non Blocking Context ") Ċ fun ĠCor outine Scope . get Responses Async ( server : ĠServer Socket , Ġtimeout : ĠLong Ġ= ĠLong . MAX _ VALUE ) Ġ= Ġproduce Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġserver . so Timeout Ġ= Ġtimeout . toInt () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . accept (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġit . getInputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġread From Stream ( inputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstrings Ġ= Ġrequest . split ("\ n \ n ". to Pattern (), Ġ 2 ). to Typed Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( strings . size Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( strings [ 1 ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket Exception ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġsocket Ġis Ġclosed ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġread From Stream ( inputStream : ĠInputStream ): ĠString Ġ{ ĊĠĠĠ ĠBufferedReader ( InputStream Reader ( inputStream , Ġ" UTF - 8 ")). use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġline : ĠString ? ĊĠĠĠĠĠĠĠ Ġwhile Ġ( reader . readLine (). also Ġ{ Ġline Ġ= Ġit Ġ} Ġ!= Ġnull ) Ġbuilder . append ( line ). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} Ċ }