package Ġpl . socket byte . th ous and . server . netty Ċ Ċ import Ġcom . es ot eric software . k ry o . K ry o Ċ import Ġio . netty . bootstrap . Server Bootstrap Ċ import Ġio . netty . channel .* Ċ import Ġio . netty . channel . ep oll . E poll Ċ import Ġio . netty . channel . ep oll . E poll EventLoop Group Ċ import Ġio . netty . channel . ep oll . E poll Server SocketChannel Ċ import Ġio . netty . channel . nio . Nio EventLoop Group Ċ import Ġio . netty . channel . socket . SocketChannel Ċ import Ġio . netty . channel . socket . nio . Nio Server SocketChannel Ċ import Ġio . netty . handler . codec . Length Field Based Frame Decoder Ċ import Ġio . netty . handler . ssl . Ssl Context Ċ import Ġio . netty . handler . ssl . Ssl Context Builder Ċ import Ġio . netty . handler . ssl . util . Self Signed Certificate Ċ import Ġio . netty . handler . timeout . Write Timeout Handler Ċ import Ġpl . socket byte . th ous and . server . game Ċ import Ġpl . socket byte . th ous and . shared . netty . Future Resolver Ċ import Ġpl . socket byte . th ous and . shared . netty . Net ty Endpoint Ċ import Ġpl . socket byte . th ous and . shared . netty . Net ty Listener Ċ import Ġpl . socket byte . th ous and . shared . netty . k ry o . K ry o Decoder Ċ import Ġpl . socket byte . th ous and . shared . netty . k ry o . K ry o Encoder Ċ import Ġpl . socket byte . th ous and . shared . netty . k ry o . K ry o Shared Register Ċ import Ġpl . socket byte . th ous and . shared . packet . Packet Ċ import Ġpl . socket byte . th ous and . shared . packet . Packet KeepAlive Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ open Ġclass ĠNet ty Server ( private Ġval Ġport : ĠInt ) ĊĠĠĠ Ġ: ĠNet ty Endpoint Ġ{ ĊĊĠĠĠ Ġval Ġexec utors Ġ= ĠExec utors . new Scheduled ThreadPool ( 2 ) ĊĠĠĠ Ġval Ġclients Ġ= Ġmutable ListOf < Channel >() ĊĊĠĠĠ Ġprivate Ġval Ġb anned Clients Ġ= Ġmutable ListOf < Channel >() ĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= Ġmutable ListOf < Net ty Listener >() ĊĠĠĠ Ġprivate Ġvar Ġssl Context : ĠS sl Context ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval Ġk ry o : ĠThread Local < K ry o > Ġ= Ġobject Ġ: ĠThread Local < K ry o >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinitial Value (): ĠK ry o Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk ry o Ġ= ĠK ry o () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK ry o Shared Register . register All ( k ry o ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġk ry o ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġval Ġfuture Resolver : ĠFuture Resolver Ġ= ĠFuture Resolver () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġchannel : ĠChannel ĊĊĠĠĠ Ġfun Ġadd Client ( channel : ĠChannel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclients . add ( channel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Client ( channel : ĠChannel ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclients . contains ( channel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Client ( channel : ĠChannel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgame . remove Player ( channel ) ĊĠĠĠĠĠĠĠ Ġclients . remove ( channel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply Certificate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( System . getProperty (" ssl ") Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs sc Ġ= ĠSelf Signed Certificate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġssl Context Ġ= ĠS sl Context Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. for Server ( ss c . certificate (), Ġs sc . privateKey ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġapply Certificate () ĊĊĠĠĠĠĠĠĠ Ġval Ġchannel Class : ĠClass < out ĠServer Channel > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( E poll . is Available ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE poll Server SocketChannel :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN io Server SocketChannel :: class . java ĊĊĠĠĠĠĠĠĠ Ġval Ġboss Group : ĠMult ith read EventLoop Group ĊĠĠĠĠĠĠĠ Ġval Ġworker Group : ĠMult ith read EventLoop Group ĊĊĠĠĠĠĠĠĠ Ġif Ġ( E poll . is Available ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboss Group Ġ= ĠE poll EventLoop Group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworker Group Ġ= ĠE poll EventLoop Group ( 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboss Group Ġ= ĠN io EventLoop Group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworker Group Ġ= ĠN io EventLoop Group ( 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbootstrap Ġ= ĠServer Bootstrap () ĊĠĠĠĠĠĠĠ Ġbootstrap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. group ( boss Group , Ġworker Group ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. channel ( channel Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. option ( Channel Option . SO _ BACK LOG , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child Handler ( object Ġ: ĠChannel Initializer < SocketChannel >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit Channel ( ch : ĠSocket Channel ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ch Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpipeline Ġ= Ġch . pipeline () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ssl Context Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . add Last ( ssl Context ?. new Handler ( ch . alloc ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . add Last (" frame ", ĠLength Field Based Frame Decoder ( 6 5 5 3 5 , Ġ 0 , Ġ 2 , Ġ 0 , Ġ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . add Last (" decoder ", ĠK ry o Decoder ( k ry o . get ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . add Last (" encoder ", ĠK ry o Encoder ( k ry o . get (), Ġ 4 Ġ* Ġ 1 0 2 4 , Ġ 1 6 Ġ* Ġ 1 0 2 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . add Last (" write Timeout Handler ", ĠWrite Timeout Handler ( 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . add Last (" handler ", ĠNet ty Channel Handler ( this @ Net ty Server , Ġlisteners )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġchannel Ġ= Ġbootstrap . bind ( port ). channel () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġdefault Ġrequest Ġtransformer ĊĠĠĠĠĠĠĠ Ġadd Listener ( object Ġ: ĠNet ty Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreceived ( connection : ĠChannel , Ġpacket : ĠPacket ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture Resolver . complete ( packet ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun ĠTCP Ġkeep - alive Ġtask ĊĠĠĠĠĠĠĠ Ġexec utors . schedule At Fixed Rate ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( client Ġin Ġclients ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( client , ĠPacket KeepAlive ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 , Ġ 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġchannel . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Response ( channel : ĠChannel , Ġrequest : ĠPacket , Ġresponse : ĠPacket ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse . id Ġ= Ġrequest . id ĊĠĠĠĠĠĠĠ Ġwrite ( channel , Ġresponse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġinline Ġfun Ġ< re ified ĠT > Ġwrite And Request ( channel : ĠChannel , Ġpacket : ĠPacket , Ġblock : Ġ( T ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfuture Resolver . register ( packet . id ) ĊĊĠĠĠĠĠĠĠ Ġwrite ( channel , Ġpacket ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfuture Resolver . await ( packet . id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull Ġ|| Ġresult Ġ! is ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġblock ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġinline Ġfun Ġ< re ified ĠT > Ġwrite And Request ( channel : ĠChannel , Ġpacket : ĠPacket ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfuture Resolver . register ( packet . id ) ĊĊĠĠĠĠĠĠĠ Ġwrite ( channel , Ġpacket ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfuture Resolver . await ( packet . id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull Ġ|| Ġresult Ġ! is ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite ( channel : ĠChannel , Ġpacket : ĠPacket ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchannel . write And Flush ( packet ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite All ( packet : ĠPacket ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( channel Ġin Ġclients ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . write And Flush ( packet ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Listener ( listener : ĠNet ty Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠ Ġ} Ċ }