hcnet
1.0.0
가상화된 서버 및 클라이언트의 하위 계층은 tcp/tcps/ws/wss/udp와 같은 프로토콜을 쉽게 전환하여 어떤 상황에서도 프로토콜 전환을 용이하게 할 수 있습니다. 온라인 번호 및 흐름 제어와 같은 후속 요구 사항은 나중에 처리됩니다.
함수 처리를 위한 콜백 통합 사용
/// 连接处理回调函数 # [ async_trait ] pub trait Handler { /// 此接口只有在服务端接受服务时进行触发 /// 接收新的端口连接, 如果处理将在此触发 async fn on_accept ( & mut self , conn : NetConn ) -> NetResult < ( ) > { let _conn = conn ; unreachable ! ( "Listener must impl accept" ) } /// 此接口在可以发送消息时触发 /// 例如websocket将在握手成功后触发该函数 async fn on_open ( & mut self ) -> NetResult < ( ) > { trace ! ( "ws on_open" ) ; Ok ( ( ) ) } /// 此接口在远程服务端被关闭时进行触发 async fn on_close ( & mut self , code : CloseCode , reason : String ) { trace ! ( "on_close code = {}, reason = {reason}" , Into :: < u16 > :: into ( code ) ) ; } /// ping消息收到, 将会自动返回pong消息 async fn on_ping ( & mut self , data : Vec < u8 > ) -> NetResult < Vec < u8 > > { trace ! ( "on_ping" ) ; Ok ( data ) } /// pong消息 async fn on_pong ( & mut self , data : Vec < u8 > ) -> NetResult < ( ) > { let _data = data ; trace ! ( "on_pong" ) ; Ok ( ( ) ) } /// message信息收到 async fn on_message ( & mut self , msg : Message ) -> NetResult < ( ) > { let _ = msg ; Ok ( ( ) ) } async fn on_request ( & mut self , req : Request < Vec < u8 > > ) -> NetResult < Response < Vec < u8 > > > { WsHandshake :: build_request ( & req ) } async fn on_response ( & mut self , res : Request < Vec < u8 > > ) -> NetResult < ( ) > { let _ = res ; Ok ( ( ) ) } }
NetConn :: tcp_bind ( "0.0.0.0:2003" , Settings :: default ( ) ) . await
NetConn :: ws_bind ( "0.0.0.0:2003" , Settings :: default ( ) ) . await
모니터링 중 인증서 정보를 구성하면 wss 프로토콜을 쉽게 지원할 수 있습니다.
let mut settings = Settings {
domain : Some ( "test.wmproxy.net" . to_string ( ) ) ,
cert : Some ( "key/example.com.pem" . to_string ( ) ) ,
key : Some ( "key/example.com.key" . to_string ( ) ) ,
.. Settings :: default ( )
} ;
NetConn :: ws_bind ( "0.0.0.0:2003" , settings ) . await
NetConn :: kcp_bind ( "0.0.0.0:2003" ) . await
기본적으로 모니터링은 일반 소켓 모니터링과 동일하며, 복잡도도 유사합니다. 어떤 프로토콜이든 마음대로 전환할 수 있습니다.
let h = conn . run_handler ( |_| ServerHandler ) . await . unwrap ( ) ;
let _ = tokio :: join! ( h ) ;
구체적인 예는 server_echo를 참조하세요.
NetConn :: tcp_connect ( "127.0.0.1:2003" ) . await
NetConn :: ws_connect ( "ws://example.com:2003" ) . await
NetConn :: ws_connect ( "wss://example.com:2003" ) . await
NetConn :: kcp_connect ( "wss://example.com:2003" ) . await
let ( mut sender , receiver ) = NetSender :: new ( 10 , 1 ) ;
let _ = conn . run_with_handler (
ClientHandler {
sender : sender . clone ( ) ,
} ,
receiver ,
) . await ;
또는
let _ = conn . run_handler ( |sender| ClientHandler { sender } ) . await ;
구체적인 예는 client_echo를 참조하세요.
먼저 서버를 시작하세요
cargo run --example server_echo tcp
클라이언트 다시 시작
cargo run --example client_echo tcp