package Ġcom . example Ċ Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . http . c io . websocket .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . routing .* Ċ import Ġio . ktor . websocket .* Ċ import Ġjava . time .* Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic .* Ċ Ċ fun Ġmain ( args : ĠArray < String >): ĠUnit Ġ= Ġio . ktor . server . netty . Engine Main . main ( args ) Ċ Ċ fun ĠApplication . module ( testing : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġinstall ( WebSocket s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġping Period Ġ= ĠDuration . of Seconds ( 1 5 ) ĊĠĠĠĠĠĠĠ Ġtimeout Ġ= ĠDuration . of Seconds ( 1 5 ) ĊĠĠĠĠĠĠĠ Ġmax Frame Size Ġ= ĠLong . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġmask ing Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠ Ġget ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text (" Hello , Ġworld !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġweb Socket ("/ echo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend (" Please Ġenter Ġyour Ġname ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( frame Ġin Ġincoming ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( frame ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFrame . Text Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceived Text Ġ= Ġframe . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( received Text . equals (" bye ", Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose ( Close Reason ( Close Reason . Codes . NORMAL , Ġ" Client Ġsaid ĠBY E ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( Frame . Text (" Hi , Ġ$ received Text ! ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconnections Ġ= ĠCollections . synchronized Set < Connection ? >( Linked HashSet ()) ĊĠĠĠĠĠĠĠ Ġweb Socket ("/ chat ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Connection Ġ= ĠConnection ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnections Ġ+= Ġthis Connection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend (" You 've Ġlogged Ġin Ġas Ġ[ ${ this Connection . name }] ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( frame Ġin Ġincoming ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( frame ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFrame . Text Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceived Text Ġ= Ġframe . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext With Username Ġ= Ġ"[ ${ this Connection . name } ]: Ġ$ received Text " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnections . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . session . send ( text With Username ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠConnection ( val Ġsession : ĠDefault WebSocket Session ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast Id Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġname Ġ= Ġ" user ${ last Id . get And Increment () }" Ċ } Ċ