package Ġcom . glo dan if . sp gt Ċ Ċ import Ġkotlinx . coroutines . experimental . launch Ċ import Ġjava . io . IOException Ċ import Ġjava . io . OutputStream Ċ import Ġjava . net . Socket Ċ Ċ class ĠWiFi Connection ( private Ġval Ġip Address : ĠString , Ġprivate Ġval Ġport : ĠInt ) Ġ: ĠAuto Closeable Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġsocket : ĠSocket ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġstream : ĠOutputStream ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠAny () ĊĊĠĠĠ Ġvar Ġon Resolution : Ġ(( String ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġshould Read Ġ= Ġtrue ĊĊĠĠĠ Ġfun Ġprepare () Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket Ġ= ĠSocket ( ipAddress , Ġport ) ĊĠĠĠĠĠĠĠ Ġstream Ġ= Ġsocket ?. get OutputStream () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( should Read ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( 2 0 4 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġsocket ?. getInputStream () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġstream ?. read ( bytes )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString ( bytes , Ġ 0 , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Resolution ?. invoke ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite ( message : ĠString ) /* Ġ= Ġlaunch */ Ġ{ ĊĊĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream ?. write (( message Ġ+ ĠSystem . getProperty (" line . separator ")). toByteArray ( Charsets . UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream ?. flush () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġshould Read Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ