1+ use futures:: { Sink , SinkExt , StreamExt } ;
12use hyper:: { Body , Request , Response , Server } ;
23use routerify:: prelude:: * ;
34use routerify:: { Middleware , Router , RouterService } ;
5+ use routerify_websocket:: { upgrade_ws, upgrade_ws_with_config, Message , WebSocket , WebSocketConfig } ;
6+ use serde:: { Deserialize , Serialize } ;
47use std:: { convert:: Infallible , net:: SocketAddr } ;
8+ use tokio_tungstenite:: {
9+ tungstenite:: protocol:: { frame:: coding:: CloseCode , CloseFrame , Message as ClientMessage } ,
10+ WebSocketStream ,
11+ } ;
512
6- async fn ws_handler ( _: Request < Body > ) -> Result < Response < Body > , Infallible > {
7- Ok ( Response :: new ( Body :: from ( "ws handler" ) ) )
13+ #[ derive( Serialize , Deserialize , Debug ) ]
14+ struct User {
15+ name : String ,
16+ roll : u64 ,
17+ }
18+
19+ async fn ws_handler ( ws : WebSocket ) {
20+ println ! ( "new websocket connection: {}" , ws. remote_addr( ) ) ;
21+
22+ let ( mut tx, mut rx) = ws. split ( ) ;
23+
24+ while let Some ( msg) = rx. next ( ) . await {
25+ let msg = msg. unwrap ( ) ;
26+
27+ println ! ( "{:?}" , msg. close_reason( ) ) ;
28+ println ! ( "{}" , String :: from_utf8( msg. into_bytes( ) ) . unwrap( ) ) ;
29+ }
830}
931
1032async fn logger ( req : Request < Body > ) -> Result < Request < Body > , Infallible > {
1133 println ! ( "{} {} {}" , req. remote_addr( ) , req. method( ) , req. uri( ) . path( ) ) ;
1234 Ok ( req)
1335}
1436
37+ // A handler for "/about" page.
38+ async fn about_handler ( _: Request < Body > ) -> Result < Response < Body > , Infallible > {
39+ println ! ( "{:?}" , std:: thread:: current( ) . id( ) ) ;
40+ Ok ( Response :: new ( Body :: from ( "About page" ) ) )
41+ }
42+
1543fn router ( ) -> Router < Body , Infallible > {
1644 Router :: builder ( )
1745 . middleware ( Middleware :: pre ( logger) )
18- . get ( "/ws/connect" , ws_handler)
46+ . get ( "/about" , about_handler)
47+ . any_method ( "/ws" , upgrade_ws ( ws_handler) )
1948 . build ( )
2049 . unwrap ( )
2150}
@@ -30,8 +59,25 @@ async fn main() {
3059
3160 let server = Server :: bind ( & addr) . serve ( service) ;
3261
62+ tokio:: spawn ( async move {
63+ tokio:: time:: delay_for ( tokio:: time:: Duration :: from_secs ( 3 ) ) . await ;
64+
65+ let ( mut ws, resp) = tokio_tungstenite:: connect_async ( "ws://127.0.0.1:3001/ws" )
66+ . await
67+ . unwrap ( ) ;
68+
69+ println ! ( "{:?}" , resp. headers( ) ) ;
70+
71+ let msg = ClientMessage :: text ( "hey" ) ;
72+ ws. send ( msg) . await . unwrap ( ) ;
73+
74+ ws. close ( None ) . await . unwrap ( ) ;
75+
76+ tokio:: time:: delay_for ( tokio:: time:: Duration :: from_secs ( 3 ) ) . await ;
77+ } ) ;
78+
3379 println ! ( "App is running on: {}" , addr) ;
3480 if let Err ( err) = server. await {
3581 eprintln ! ( "Server error: {}" , err) ;
3682 }
37- }
83+ }
0 commit comments