package Ġcom . le ov p . socket _ sdk . framework . server Ċ Ċ import Ġcom . le ov p . log _ sdk . Log Context Ċ import Ġcom . le ov p . min _ base _ sdk . to HexString Ċ import Ġcom . le ov p . min _ base _ sdk . to HexString LE Ċ import Ġcom . le ov p . socket _ sdk . framework . base . Base Net ty Ċ import Ġcom . le ov p . socket _ sdk . framework . base . Server Connect Status Ċ import Ġio . netty . bootstrap . Server Bootstrap Ċ import Ġio . netty . buffer . Byte Buf Ċ import Ġio . netty . buffer . Un p ooled Ċ import Ġio . netty . channel .* Ċ 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 . http . Http Object Aggregator Ċ import Ġio . netty . handler . codec . http . HttpServer Codec Ċ import Ġio . netty . handler . codec . http . websocket x . Binary WebSocket Frame Ċ import Ġio . netty . handler . codec . http . websocket x . Ping WebSocket Frame Ċ import Ġio . netty . handler . codec . http . websocket x . Text WebSocket Frame Ċ import Ġio . netty . handler . codec . http . websocket x . WebSocket Server Protocol Handler Ċ import Ġio . netty . handler . logging . LogLevel Ċ import Ġio . netty . handler . logging . Logging Handler Ċ import Ġio . netty . handler . stream . Chunk ed Write Handler Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . util . concurrent . Rejected ExecutionException Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ /** Ċ Ġ* ĠAuthor : ĠMichael ĠLe o Ċ Ġ* ĠDate : Ġ 2 0 - 8 - 5 Ġä¸ĭåįĪ 2 : 3 4 Ċ Ġ*/ Ċ abstract Ġclass ĠBase Net ty Server Ġprotected Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġport : ĠInt , ĊĠĠĠ Ġval Ġconnection Listener : ĠServer Connect Listener < Base Net ty Server >, ĊĠĠĠ Ġinternal Ġvar Ġis WebSocket : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġinternal Ġvar Ġweb Socket Path : ĠString Ġ= Ġ"/", ĊĠĠĠ Ġtimeout : ĠInt Ġ= ĠCONNECTION _ TIMEOUT _ IN _ MIL LS Ċ ) Ġ: ĠBase Net ty () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCONNECTION _ TIMEOUT _ IN _ MIL LS Ġ= Ġ 3 0 _ 0 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtag : ĠString Ġby Ġlazy Ġ{ Ġget TagName () Ġ} ĊĠĠĠ Ġabstract Ġfun Ġget TagName (): ĠString ĊĊĠĠĠ Ġprivate Ġval Ġboss Group Ġ= ĠN io EventLoop Group () ĊĠĠĠ Ġprivate Ġval Ġworker Group Ġ= ĠN io EventLoop Group () ĊĠĠĠ Ġprivate Ġval Ġbootstrap Ġ= ĠServer Bootstrap () ĊĠĠĠĠĠĠĠ Ġ. group ( boss Group , Ġworker Group ) ĊĠĠĠĠĠĠĠ Ġ. channel ( Nio Server SocketChannel :: class . java ) ĊĠĠĠĠĠĠĠ Ġ. handler ( Logging Handler ( LogLevel . INFO )) ĊĠĠĠĠĠĠĠ Ġ. option ( Channel Option . SO _ BACK LOG , Ġ 1 0 2 4 ) ĊĠĠĠĠĠĠĠ Ġ. child Option ( Channel Option . TCP _ NODE LAY , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ. child Option ( Channel Option . SO _ KEEP AL IVE , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ. child Option ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel Option . CONNECT _ TIMEOUT _ M ILL IS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġserver Channel : ĠChannel ĊĠĠĠ Ġprivate Ġvar Ġchannel Initializer : ĠChannel Initializer < *> ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġdefault Server Inbound Handler : ĠBase Server Channel Inbound Handler < *> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprotected Ġset ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġinternal Ġvar Ġconnect State : ĠAtomic Reference < Server Connect Status > Ġ= ĠAtomic Reference ( ĊĠĠĠĠĠĠĠ ĠServer Connect Status . UN INITIAL IZED ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġopen Ġfun Ġadd Last To Pipeline ( pipeline : ĠChannel Pipeline ) Ġ{} ĊĊĠĠĠ Ġfun Ġinit Handler ( handler : ĠBase Server Channel Inbound Handler < *> ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Server Inbound Handler Ġ= Ġhandler ĊĠĠĠĠĠĠĠ Ġchannel Initializer Ġ= Ġobject Ġ: ĠChannel Initializer < SocketChannel >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit Channel ( socket Channel : ĠSocket Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( socket Channel . pipeline ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is WebSocket ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( web Socket Path ?. scheme Ġ?: Ġ""). startsWith (" wss ", Ġignore Case Ġ= Ġtrue )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . w ( tag , Ġ" Working Ġin Ġw ss Ġmode ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġssl Ctx : ĠS sl Context Ġ= ĠS sl Context Builder . for Client (). trust Manager ( In secure Trust ManagerFactory . INSTANCE ). build () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME Ċ //// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . add First ( ssl Ctx . new Handler ( server SocketChannel . alloc (), Ġhost , Ġport )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( HttpServer Codec ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( Http Object Aggregator ( 6 5 5 3 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠA Ġ[ Channel Handler ] Ġthat Ġadds Ġsupport Ġfor Ġwriting Ġa Ġlarge Ġdata Ġstream Ġasynchronously ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġneither Ġs pending Ġa Ġlot Ġof Ġmemory Ġnor Ġgetting Ġ[ OutOf Memory Error ]. Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( Chunk ed Write Handler ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME ĠIf Ġadd Ġthis , Ġthe Ġserver Ġcan Ġnot Ġreceive Ġclient Ġmessage . Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( WebSocket Server Compression Handler ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( WebSocket Server Protocol Handler ( web Socket Path )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( Delimiter Based Frame Decoder ( 6 5 5 3 5 , Ġ* Delimit ers . line Delimiter ())) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( String Decoder ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( String Encoder ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last To Pipeline ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Server Inbound Handler ?. let Ġ{ Ġadd Last (" default - server - inbound - handler ", Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbootstrap . child Handler ( channel Initializer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġserver Ġhas Ġalready Ġbeen Ġreleased , Ġcall Ġthis Ġmethod Ġwill Ġthrow Ġ[ java . util . concurrent . Rejected ExecutionException ]: Ġevent Ġexecutor Ġterminated ĊĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġ@ Throws ( Rejected ExecutionException :: class ) ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġstart Server () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Context . log . i ( tag , Ġ" ===== Ġconnect () Ġcurrent Ġstate =${ connect State . get (). name } Ġ=== ==" ) ĊĠĠĠĠĠĠĠ Ġif Ġ( connect State . get () Ġ== ĠServer Connect Status . STARTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . w ( tag , Ġ" ===== ĠAlready Ġstarted Ġor Ġnot Ġinitialized Ġ=== ==" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Channel Ġ= Ġbootstrap . bind ( port ). sync (). channel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect State . set ( Server Connect Status . STARTED ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . i ( tag , Ġ" ===== ĠStart Ġsuccessfully Ġ=== ==" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Listener . on Started ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAfter Ġrunning Ġthis Ġline Ġbelow , Ġthe Ġprocess Ġwill Ġstuck Ġthere Ġand Ġwaiting Ġclient Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Channel . close Future (). sync () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġserver Channel . close Ġbe Ġexecuted , Ġthe Ġprocess Ġwill Ġcontinue Ġto Ġrun . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . i ( tag , Ġ" ===== ĠSto pping Ġserver ... Ġ=== ==" ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠReject ed ExecutionException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . e ( tag , Ġ" ===== ĠReject ed ExecutionException : Ġ${ e . message } Ġ=== ==", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . e ( tag , Ġ" Net ty Ġserver Ġhad Ġalready Ġbeen Ġreleased . ĠYou Ġmust Ġre - initialize Ġit Ġagain .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect State . set ( Server Connect Status . FAILED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Listener . onStart Failed ( this , ĠServer Connect Listener . CONNECTION _ ERROR _ AL READY _ RELEASE D , Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect State . set ( Server Connect Status . FAILED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Listener . onStart Failed ( this , ĠServer Connect Listener . CONNECTION _ ERROR _ SERVER _ START _ ERROR , Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġand Ġrelease Ġserver Ġusing Ġ** sync Un interrupt ibly ** Ġmethod .( Full Ġrelease Ġwill Ġcost Ġalmost Ġ 4 s .) ĠSo Ġyou 'd Ġbetter ĠNOT Ġcall Ġthis Ġmethod Ġin Ġmain Ġthread . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOnce Ġyou Ġcall Ġthis Ġmethod , Ġyou Ġcan Ġnot Ġstart Ġserver Ġagain Ġsimply Ġby Ġcalling Ġ[ start Server ] Ġbecause Ġof Ġthe ĠServer ĠNet ty Ġobject Ġwill Ġbe Ġreleased . ĊĠĠĠĠ Ġ* ĠIf Ġyou Ġwant Ġto Ġstart Ġserver Ġagain , Ġyou Ġmust Ġrecreate Ġthe ĠServer ĠNet ty Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop Server (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Context . log . w ( tag , Ġ" ===== Ġstop Server () Ġcurrent Ġstate =${ connect State . get (). name } Ġ=== ==" ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! :: server Channel . isInitialized Ġ|| ĠServer Connect Status . UN INITIAL IZED Ġ== Ġconnect State . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . w ( tag , Ġ" Already Ġrelease Ġor Ġnot Ġinitialized ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconnect State . set ( Server Connect Status . UN INITIAL IZED ) ĊĊĠĠĠĠĠĠĠ ĠLog Context . log . w ( tag , Ġ" Re leasing Ġdefault Ġserver Ġinbound Ġhandler Ġfirst ...") ĊĠĠĠĠĠĠĠ Ġdefault Server Inbound Handler ?. release () ĊĠĠĠĠĠĠĠ Ġdefault Server Inbound Handler Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġchannel Initializer Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġserver Channel . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . w ( tag , Ġ" Closing Ġchannel ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline (). removeAll Ġ{ Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Future () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose (). sync Un interrupt ibly () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĠLog Context . log . e ( tag , Ġ" Close Ġchannel Ġerror .", Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . w ( tag , Ġ" Re leasing Ġboss Group ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboss Group . shutdown Grace fully (). sync Un interrupt ibly () Ġ// ĠWill Ġnot Ġstuck Ġhere . ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĠLog Context . log . e ( tag , Ġ" Shutdown Ġboss Group Ġerror .", Ġit ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . w ( tag , Ġ" Re leasing Ġworker Group ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworker Group . shutdown Grace fully (). sync Un interrupt ibly () Ġ// ĠWill Ġnot Ġstuck Ġhere . ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĠLog Context . log . e ( tag , Ġ" Shutdown Ġworker Group Ġerror .", Ġit ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog Context . log . w ( tag , Ġ" ==== => ĠServer Ġreleased Ġ< ==== =") ĊĠĠĠĠĠĠĠ Ġconnect State . set ( Server Connect Status . STOP PED ) ĊĠĠĠĠĠĠĠ Ġconnection Listener . on Stopped () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ================================= =============== ĊĊĠĠĠ Ġprivate Ġfun ĠisValid ExecuteCommand Env ( client Channel : ĠChannel , Ġcmd Type And Id : ĠString , Ġcmd : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cmd Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . e ( cmd Type And Id , Ġ" The Ġcommand Ġis Ġnull . ĠStop Ġprocessing .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( cmd Ġ! is ĠString Ġ&& Ġcmd Ġ! is ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Command Ġmust Ġbe Ġeither ĠString Ġor ĠByteArray .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! client Channel . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . e ( cmd Type And Id , Ġ" Client Ġchannel Ġis Ġnot Ġactive . ĠCan Ġnot Ġsend Ġcommand .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġis Ping ĠOnly Ġworks Ġin ĠWebSocket Ġmode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġexecute Unified Command ( ĊĠĠĠĠĠĠĠ Ġclient Channel : ĠChannel , ĊĠĠĠĠĠĠĠ Ġcmd Type And Id : ĠString , ĊĠĠĠĠĠĠĠ Ġcmd Desc : ĠString ?, ĊĠĠĠĠĠĠĠ Ġcmd : ĠAny ?, ĊĠĠĠĠĠĠĠ Ġis Ping : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġshow Content : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġshow Log : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġbyte Order : ĠByte Order ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isValid ExecuteCommand Env ( client Channel , Ġcmd Type And Id , Ġcmd )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstring Cmd : ĠString ? ĊĠĠĠĠĠĠĠ Ġval Ġbytes Cmd : ĠByte Buf ? ĊĠĠĠĠĠĠĠ Ġval Ġis String Cmd : ĠBoolean ĊĠĠĠĠĠĠĠ Ġval Ġlog Prefix Ġ= Ġif Ġ( cmd Desc . isNull Or Blank ()) Ġ" exe " Ġelse Ġ" exe [$ cmd Desc ]" ĊĠĠĠĠĠĠĠ Ġwhen Ġ( cmd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis String Cmd Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Cmd Ġ= Ġcmd ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Cmd Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Content ) ĠLog Context . log . i ( cmd Type And Id , Ġ"$ log Prefix [ ${ cmd . length }] =$ cmd ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠLog Context . log . i ( cmd Type And Id , Ġ"$ log Prefix [ ${ cmd . length }] ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByteArray Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis String Cmd Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Cmd Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Cmd Ġ= ĠUn p ooled . wrapped Buffer ( cmd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Content Ġ= Ġif Ġ( Byte Order . BIG _ ENDIAN Ġ== Ġbyte Order ) Ġcmd . to HexString () Ġelse Ġcmd . to HexString LE () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Context . log . i ( cmd Type And Id , Ġ"$ log Prefix [ ${ cmd . size } ]= HEX [$ bytes Content ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠLog Context . log . i ( cmd Type And Id , Ġ"$ log Prefix [ ${ cmd . size }] ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Command Ġmust Ġbe Ġeither ĠString Ġor ĠByteArray ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is WebSocket ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Ping ) Ġclient Channel . write And Flush ( Ping WebSocket Frame ( if Ġ( isString Cmd ) ĠUn p ooled . wrapped Buffer ( string Cmd !!. toByteArray ()) Ġelse Ġbytes Cmd )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġclient Channel . write And Flush ( if Ġ( isString Cmd ) ĠText WebSocket Frame ( string Cmd ) Ġelse ĠBinary WebSocket Frame ( bytes Cmd )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Channel . write And Flush ( if Ġ( isString Cmd ) Ġ"$ string Cmd \ n " Ġelse Ġbytes Cmd ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġexecute Command ( ĊĠĠĠĠĠĠĠ Ġclient Channel : ĠChannel , ĊĠĠĠĠĠĠĠ Ġcmd : ĠAny ?, ĊĠĠĠĠĠĠĠ Ġcmd Desc : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġcmd Type And Id : ĠString Ġ= Ġtag , ĊĠĠĠĠĠĠĠ Ġshow Content : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġshow Log : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġbyte Order : ĠByte Order Ġ= ĠByte Order . LIT TLE _ ENDIAN ĊĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠĠĠ Ġexecute Unified Command ( client Channel , Ġcmd Type And Id , Ġcmd Desc , Ġcmd , Ġis Ping Ġ= Ġfalse , Ġshow Content Ġ= Ġshow Content , Ġshow Log Ġ= Ġshow Log , Ġbyte Order Ġ= Ġbyte Order ) ĊĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġexecute Ping Command ( ĊĠĠĠĠĠĠĠ Ġclient Channel : ĠChannel , ĊĠĠĠĠĠĠĠ Ġcmd : ĠAny ?, ĊĠĠĠĠĠĠĠ Ġcmd Desc : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġcmd Type And Id : ĠString Ġ= Ġtag , ĊĠĠĠĠĠĠĠ Ġshow Content : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġshow Log : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġbyte Order : ĠByte Order Ġ= ĠByte Order . LIT TLE _ ENDIAN ĊĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠĠĠ Ġexecute Unified Command ( client Channel , Ġcmd Type And Id , Ġcmd Desc , Ġcmd , Ġis Ping Ġ= Ġtrue , Ġshow Content Ġ= Ġshow Content , Ġshow Log Ġ= Ġshow Log , Ġbyte Order Ġ= Ġbyte Order ) ĊĊĠĠĠ Ġ// Ġ================================= =============== Ċ }