package Ġnl . joo zd . time check . com ms Ċ Ċ import Ġtime Check Protocol . Packet Ċ import Ġandroid . util . Log Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . io . Buffered InputStream Ċ import Ġjava . io . Buffered OutputStream Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Connect Exception Ċ import Ġjava . net . Socket Exception Ċ import Ġjava . net . Unknown Host Exception Ċ import Ġjavax . net . ssl . SS LS ocket Factory Ċ Ċ @ Suppress (" Blocking Method In Non Blocking Context ") Ċ class ĠClient : ĠClose able Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsocket Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠSSL Socket Factory . getDefault (). create Socket ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSERVER _ URL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSERVER _ PORT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Error Ġcreating ĠSSL Socket :") ĊĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġio e . stack Trace . toString ()) ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġdata Ġto Ġserver . ĠOn Ġsuccess , Ġreturns Ġthe Ġamount Ġof Ġbytes Ġsent , Ġon Ġfailure Ġreturns Ġa Ġnegative ĠInteger ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġsend ToServer ( packet : ĠPacket ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" sending Ġ${ packet . payload . size } Ġbytes ") ĊĠĠĠĠĠĠĠ Ġ// ĠLog . d (" Send ToServer :", Ġpacket . message . take ( 4 0 ). toByteArray (). toString ( Charsets . UTF _ 8 )) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠBuffered OutputStream ( it . get OutputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write ( packet . raw Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpacket . raw Data . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġ 0 0 0 5 : ĠSocket Ġis Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 5 ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( he : ĠUnknown Host Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception String Ġ= Ġ" An Ġexception Ġ 0 0 0 1 Ġoccurred :\ n Ġ${ he . printStackTrace () }" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġexception String , Ġhe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception String Ġ= Ġ" An Ġexception Ġ 0 0 0 2 Ġoccurred :\ n Ġ${ io e . printStackTrace () }" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġexception String , Ġio e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 2 ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ce : ĠConnect Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception String Ġ= Ġ" An Ġexception Ġ 0 0 0 3 Ġoccurred :\ n Ġ${ ce . printStackTrace () }" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġexception String , Ġce ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 3 ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( se : ĠSocket Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception String Ġ= Ġ" An Ġexception Ġ 0 0 0 4 Ġoccurred :\ n Ġ${ se . printStackTrace () }" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġexception String , Ġse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 4 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġlists ner Ġf Ġwith Ġa Ġ 0 - 1 0 0 Ġpercentage Ġcompleted Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġread From Server ( f : Ġ( Int ) Ġ-> ĠUnit Ġ= Ġ{} ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Input ( Buffered InputStream ( with Context ( Dispatch ers . IO ) Ġ{ Ġit . getInputStream () Ġ}), Ġf ). also { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" got Ġ${ it . toString ( Charsets . UTF _ 8 )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error : Ġ$ e , Ġ${ e . printStackTrace () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error : Ġ$ e , Ġ${ e . printStackTrace () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġlistener Ġf Ġwith Ġa Ġ 0 - 1 0 0 Ġpercentage Ġcompleted Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Input ( inputStream : ĠBuffered InputStream , Ġf : Ġ( Int ) Ġ-> ĠUnit Ġ= Ġ{} ): ĠByteArray Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" re ceiving Ġpacket ") ĊĠĠĠĠĠĠĠ ĠPacket . from InputStream ( inputStream , Ġf ). payload . also { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Done !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket ?. close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSERVER _ URL Ġ= Ġ" joo zd . nl " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSERVER _ PORT Ġ= Ġ 1 3 3 3 7 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" comm . protocol . Client " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġan Ġopen Ġinstance Ġif Ġit Ġis Ġavailable ĊĠĠĠĠĠĠĠĠ Ġ* ĠClient Ġwill Ġbe Ġlocked Ġunt ill Ġstarting Ġtime Out () ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ} Ċ }