package Ġns Ċ Ċ import Ġjava . net . Data gram Socket Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . Server Socket Ċ import Ġjava . net . Socket Ċ import Ġjava . util .* Ċ import Ġprime iro . Interface Ċ Ċ class ĠName Server Ġ: ĠInterface Ġ{ ĊĊĠ Ġprivate Ġvar Ġ_ socket : ĠServer Socket ĊĠ Ġprivate Ġvar Ġ_ d gram Socket : ĠData gram Socket ĊĠ Ġprivate Ġvar Ġ_ port : ĠInt ĊĊĠ Ġconstructor Ġ( port : ĠInt ) Ġ{ ĊĠĠĠ Ġ_ port Ġ= Ġport ĊĊĠĠĠ Ġ_ socket Ġ= ĠServer Socket ( port ) ĊĠĠĠ Ġ_ d gram Socket Ġ= ĠData gram Socket () ĊĊĠĠĠ Ġprintln (" Server Ġrunning Ġat Ġ$_ port ") ĊĠ Ġ} ĊĊĠ Ġfun Ġaccept Connection (): ĠSocket Ġ= Ġ_ socket . accept () ĊĊĠ Ġfun Ġclient Handler ( client : ĠConnection ) Ġ{ ĊĊĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠ Ġvar Ġrequest Ġ= Ġclient . receive Message () ĊĠĠĠĠĠ Ġvar Ġrequest Type Ġ= Ġrequest . get ( 0 ). toInt () ĊĊĠĠĠĠĠ Ġwhile Ġ( request Type Ġ!= Ġ 4 ) Ġ{ Ġ// Ġ 4 - QU IT ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Type Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġconnect Peer ( client , Ġrequest ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request Type Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġsend Connected Hosts Nick names ( client ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request Type Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġhost Information By Nick name ( client , Ġrequest ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequest Ġ= Ġclient . receive Message () ĊĠĠĠĠĠĠĠ Ġrequest Type Ġ= Ġrequest . get ( 0 ). toInt () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ_ peers . remove ( client ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġconnect Peer ( client : ĠConnection , Ġrequest : ĠByteArray ): ĠBoolean Ġ{ ĊĠĠĠ Ġ// Ġval Ġclient : ĠConnection Ġ= ĠConnection (_ peers . size , Ġsocket ) ĊĠĠĠ Ġ// Ġval Ġrequest Ġ= Ġclient . receive Message () ĊĊĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠ Ġ// Ġnickname ĊĠĠĠĠĠ Ġval Ġnickname Size Ġ= Ġrequest . get ( 1 ). toInt () ĊĠĠĠĠĠ Ġval Ġnickname : ĠString Ġ= Ġnickname By Request ( request ) ĊĠĠĠĠĠ Ġvar Ġbegin Valid Ġ= Ġ( 2 Ġ+ Ġnickname Size ) ĊĊĠĠĠĠĠ Ġ// Ġaddress ĊĠĠĠĠĠ Ġval Ġaddress Size Ġ= Ġrequest . get ( begin Valid ). toInt () ĊĠĠĠĠĠ Ġval Ġaddress : ĠInet Address Ġ= Ġaddress By Request ( request , Ġbegin Valid ) ĊĠĠĠĠĠ Ġbegin Valid Ġ+= Ġ( 1 Ġ+ Ġaddress Size ) ĊĊĠĠĠĠĠ Ġ// Ġport ĊĊĊĠĠĠĠĠ Ġbegin Valid Ġ= Ġrequest . size Ġ- Ġ 5 ĊĠĠĠĠĠ Ġval ĠHEX port 3 : ĠInt Ġ= Ġ( request . get ( begin Valid Ġ+ Ġ 0 ). toInt ()) Ġshl Ġ 2 4 ĊĠĠĠĠĠ Ġval ĠHEX port 2 : ĠInt Ġ= Ġ( request . get ( begin Valid Ġ+ Ġ 1 ). toInt ()) Ġshl Ġ 1 6 ĊĠĠĠĠĠ Ġval ĠHEX port 1 : ĠInt Ġ= Ġ( request . get ( begin Valid Ġ+ Ġ 2 ). toInt ()) Ġshl Ġ 8 ĊĠĠĠĠĠ Ġval ĠHEX port 0 : ĠInt Ġ= Ġ( request . get ( begin Valid Ġ+ Ġ 3 ). toInt ()) Ġshl Ġ 0 ĊĊĠĠĠĠĠ Ġval Ġport : ĠInt Ġ= ĠHEX port 3 Ġor ĠHEX port 2 Ġor ĠHEX port 1 Ġor ĠHEX port 0 ĊĊĠĠĠĠĠ Ġprintln ( port ) ĊĊĠĠĠĠĠ Ġclient . set Nick name ( nickname ) ĊĠĠĠĠĠ Ġclient . set Address ( address ) ĊĠĠĠĠĠ Ġclient . set Port ( port ) ĊĊĠĠĠĠĠ Ġ_ peers . add ( client ) ĊĊĠĠĠĠĠ Ġclient . sendMessage ( byte ArrayOf ( 1 , Ġ 1 )) Ġ// ĠSUCCESS ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġclient . sendMessage ( byte ArrayOf ( 1 , Ġ 2 )) Ġ// ĠFAILURE ĊĠĠĠĠĠ Ġprintln ( t ) ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsend Connected Hosts Nick names ( peer : ĠConnection ) Ġ{ ĊĊĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠ Ġval Ġresponse : ĠMutable List < Byte > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠ Ġval Ġtype Ġ= Ġ 1 ĊĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġ 1 ĊĠĠĠĠĠ Ġresponse . add ( type . to Byte ()) ĊĠĠĠĠĠ Ġresponse . add ( success . to Byte ()) ĊĊĠĠĠĠĠ Ġval ĠnumberOf Connected Peers Ġ= Ġ_ peers . size Ġ- Ġ 1 ĊĊĠĠĠĠĠ Ġresponse . add ( numberOf Connected Peers . to Byte ()) ĊĊĠĠĠĠĠ Ġval Ġpeer Nick name Ġ= Ġpeer . get Nick name () ĊĊĠĠĠĠĠ Ġ_ peers . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnickname Ġ= Ġit . get Nick name () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( nickname Ġ!= Ġpeer Nick name ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġnickname Size Ġ= Ġnickname . length ĊĠĠĠĠĠĠĠĠĠ Ġresponse . add ( nickname Size . to Byte ()) ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. nickname Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . add ( nickname . get ( i Ġ- Ġ 1 ). to Byte ()) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġpeer . sendMessage ( response . toByteArray ()) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġpeer . sendMessage ( byte ArrayOf ( 1 , Ġ 2 )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhost Information By Nick name ( peer : ĠConnection , Ġrequest : ĠByteArray ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠ Ġval Ġnickname : ĠString Ġ= Ġnickname By Request ( request ) ĊĊĠĠĠĠĠ Ġval Ġpeer Nick name Ġ= Ġpeer . get Nick name () ĊĊĠĠĠĠĠ Ġif Ġ( nickname Ġ!= Ġpeer Nick name ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠMutable List < Byte > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġresponse . add ( type . to Byte ()) ĊĠĠĠĠĠĠĠ Ġresponse . add ( success . to Byte ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġaddress : ĠString Ġ= Ġpeer . getAddress () ĊĠĠĠĠĠĠĠ Ġval Ġaddress Size Ġ= Ġaddress . length ĊĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġpeer . getPort () ĊĊĠĠĠĠĠĠĠ Ġval ĠHEX port 3 : ĠInt Ġ= Ġ( port ) Ġshr Ġ 2 4 ĊĠĠĠĠĠĠĠ Ġval ĠHEX port 2 : ĠInt Ġ= Ġ( port Ġand Ġ 0 x 0 0 ff 0 0 0 0 ) Ġshr Ġ 1 6 ĊĠĠĠĠĠĠĠ Ġval ĠHEX port 1 : ĠInt Ġ= Ġ( port Ġand Ġ 0 x 0 0 0 0 ff 0 0 ) Ġshr Ġ 8 ĊĠĠĠĠĠĠĠ Ġval ĠHEX port 0 : ĠInt Ġ= Ġ( port Ġand Ġ 0 x 0 0 0 0 0 0 ff ) ĊĊĠĠĠĠĠĠĠ Ġresponse . add ( address Size . to Byte ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. address Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresponse . add ( address . get ( i Ġ- Ġ 1 ). to Byte ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresponse . add ( HEX port 3 . to Byte ()) ĊĠĠĠĠĠĠĠ Ġresponse . add ( HEX port 2 . to Byte ()) ĊĠĠĠĠĠĠĠ Ġresponse . add ( HEX port 1 . to Byte ()) ĊĠĠĠĠĠĠĠ Ġresponse . add ( HEX port 0 . to Byte ()) ĊĊĠĠĠĠĠĠĠ Ġpeer . sendMessage ( response . toByteArray ()) Ġ// ĠSUCCESS ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġpeer . sendMessage ( byte ArrayOf ( 1 , Ġ 2 )) Ġ// ĠFAILURE ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġpeer . sendMessage ( byte ArrayOf ( 1 , Ġ 2 )) Ġ// ĠFAILURE ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġnickname By Request ( request : ĠByteArray ): ĠString Ġ{ ĊĠĠĠ Ġ// Ġnickname ĊĠĠĠ Ġvar Ġbegin Valid Ġ= Ġ 1 ĊĠĠĠ Ġval Ġnickname Size Ġ= Ġrequest . get ( begin Valid ). toInt () ĊĠĠĠ Ġval Ġnickname Byte : ĠMutable List < Byte > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġbegin Valid Ġ+= Ġ 1 ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. nickname Size ) Ġ{ ĊĠĠĠĠĠ Ġnickname Byte . add ( request . get ( begin Valid )) ĊĠĠĠĠĠ Ġbegin Valid Ġ+= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnickname Byte . toByteArray (). toString ( Charsets . UTF _ 8 ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġaddress By Request ( request : ĠByteArray , Ġbegin Valid : ĠInt ): ĠInet Address Ġ{ ĊĊĠĠĠ Ġvar Ġindex Ġ= Ġbegin Valid ĊĊĠĠĠ Ġval Ġaddress Size Ġ= Ġrequest . get ( index ). toInt () ĊĠĠĠ Ġindex Ġ+= Ġ 1 ĊĠĠĠ Ġval Ġaddress Byte : ĠMutable List < Byte > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. address Size ) Ġ{ ĊĠĠĠĠĠ Ġaddress Byte . add ( request . get ( index )) ĊĠĠĠĠĠ Ġindex Ġ+= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠInet Address . get ByName ( address Byte . toByteArray (). toString ( Charsets . UTF _ 8 )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsend Connected Peers () Ġ{ ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġ_ peers : ĠMutable List < Connection > Ġ= Ġmutable ListOf () Ċ } ĊĊ