package Ġcom . wr bug . developer helper . ipc . proces ssh are . tcp Ċ Ċ import Ġcom . wr bug . developer helper . common util . print Ċ import Ġorg . jetbrains . ank o . do Async Ċ import Ġjava . io .* Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . Server Socket Ċ import Ġjava . net . Socket Ċ import Ġjava . net . SocketAddress Ċ import Ġjava . util .* Ċ Ċ class ĠTCP Server Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm Message Listener : ĠOn Message Received ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Connect Listener : ĠOn Connect ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Disconnect Listener : ĠOn Disconnect ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Server Closed Listener : ĠOn Server Close ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Server Start Listener : ĠOn Server Start ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġserver Socket : ĠServer Socket ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlast Client Index : ĠShort Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġclients : ĠMutable Map < Int , ĠClient > Ġ= ĠHashMap () ĊĠĠĠ Ġvar Ġis Server Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġfun Ġstart Server ( port : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Server ( Integer . valueOf ( port )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Server ( port : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Server Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsocket : ĠSocket ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Socket Ġ= ĠServer Socket ( port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Server Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(" start Server : Ġ" Ġ+ Ġ( m Server Start Listener Ġ!= Ġnull )). print () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Server Start Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Server Start Listener !!. server Started ( port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( is Server Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Accept ing Ġclient ". print () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= Ġserver Socket !!. accept () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠClient ( socket ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Client Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclients [ last Client Index . toInt ()] Ġ= Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread ( client ). start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . set Index ( last Client Index . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Connect Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connect Listener !!. connected ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . local Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ socket . local Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . local SocketAddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Client Index . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Server Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Server Closed Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Server Closed Listener !!. server Closed ( port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose Server () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" close Server : Ġ". print () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Server Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Socket !!. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkick All () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġkick All () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( client Ġin Ġclients . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . kill () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġkick ( client Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclients [ client Index ] !!. kill () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend ln ( client Index : ĠInt , Ġmessage : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġclients [ client Index ]?. output ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend ( client Index : ĠInt , Ġmessage : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġclients [ client Index ]?. output ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbroadcast ( message : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( client Ġin Ġclients . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . output ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbroadcast ln ( message : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( client Ġin Ġclients . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . output ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Clients (): ĠMap < Int , ĠClient > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclients ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġclients Count : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġclients . size ĊĊĠĠĠ Ġ// -------------------------------- ------------- [ Listeners ] -------------------------------- -------------- // ĊĠĠĠ Ġfun Ġset On Message Received Listener ( listener : ĠOn Message Received ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Message Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Connect Listener ( listener : ĠOn Connect ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Connect Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Disconnect Listener ( listener : ĠOn Disconnect ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Disconnect Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Server Closed Listener ( listener : ĠOn Server Close ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Server Closed Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Server Start Listener ( listener : ĠOn Server Start ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Server Start Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------- ------------- [ Interfaces ] -------------------------------- ------------- // ĊĠĠĠ Ġinterface ĠOn Message Received Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġmessage Received ( message : ĠString ?, Ġclient Index : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Connect Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġconnected ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket : ĠSocket ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Address : ĠInet Address ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal SocketAddress : ĠSocket Address ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Index : ĠInt ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Disconnect Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdisconnected ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket : ĠSocket ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Address : ĠInet Address ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal SocketAddress : ĠSocket Address ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Index : ĠInt ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Server Close Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġserver Closed ( port : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Server Start Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġserver Started ( port : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------- ------------ [ Client Ġclass ] -------------------------------- ------------ // ĊĠĠĠ Ġinner Ġclass ĠClient ( private Ġval Ġsocket : ĠSocket ) Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoutput : ĠPrintWriter ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinput : ĠBufferedReader ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġclient Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( is Server Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Read Ġline Ġ( Client : Ġ$ client Index ) ". print () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġinput !!. readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Message Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclients . remove ( client Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Disconnect Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Disconnect Listener !!. disconnected ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . local Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ socket . local Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . local SocketAddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Message Listener !!. message Received ( line , Ġclient Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġkill () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . shutdown Input () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . shutdown Output () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Index ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Index Ġ= Ġindex ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= ĠBufferedReader ( InputStream Reader ( socket . getInputStream ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrintWriter ( Buffered Writer ( OutputStream Writer ( socket . get OutputStream ())), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }