{"id":18899932,"url":"https://github.com/hcengine/hcnet","last_synced_at":"2026-03-11T01:01:38.441Z","repository":{"id":257801405,"uuid":"863277080","full_name":"hcengine/hcnet","owner":"hcengine","description":"rust net wrap, support tcp/websocket/udp 网络层封装, 可以轻松的切换网络","archived":false,"fork":false,"pushed_at":"2025-03-18T09:08:55.000Z","size":116,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-10-30T08:57:23.411Z","etag":null,"topics":["kcp","net","tcp","udp","websocket","websocket-client","websocket-server"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hcengine.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-26T02:55:00.000Z","updated_at":"2025-03-18T09:08:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"cb3f5267-a818-4ceb-8c32-fa5cd9f168eb","html_url":"https://github.com/hcengine/hcnet","commit_stats":null,"previous_names":["hcengine/hcnet"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hcengine/hcnet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hcengine%2Fhcnet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hcengine%2Fhcnet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hcengine%2Fhcnet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hcengine%2Fhcnet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hcengine","download_url":"https://codeload.github.com/hcengine/hcnet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hcengine%2Fhcnet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30364604,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"ssl_error","status_checked_at":"2026-03-10T21:40:59.357Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kcp","net","tcp","udp","websocket","websocket-client","websocket-server"],"created_at":"2024-11-08T08:48:00.360Z","updated_at":"2026-03-11T01:01:38.403Z","avatar_url":"https://github.com/hcengine.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# hcnet\n\n虚拟化服务端及客户端的底层，可以轻松的切换tcp/tcps/ws/wss/udp等协议， 以方便在任意情况下切换协议。后续例如在线数，流控等需求再来进行处理。\n\n## 回调处理\n\n统一用回调进行处理函数\n```rust\n\n/// 连接处理回调函数\n#[async_trait]\npub trait Handler {\n    /// 此接口只有在服务端接受服务时进行触发\n    /// 接收新的端口连接, 如果处理将在此触发\n    async fn on_accept(\u0026mut self, conn: NetConn) -\u003e NetResult\u003c()\u003e {\n        let _conn = conn;\n        unreachable!(\"Listener must impl accept\")\n    }\n\n    /// 此接口在可以发送消息时触发\n    /// 例如websocket将在握手成功后触发该函数\n    async fn on_open(\u0026mut self) -\u003e NetResult\u003c()\u003e {\n        trace!(\"ws on_open\");\n        Ok(())\n    }\n\n    /// 此接口在远程服务端被关闭时进行触发\n    async fn on_close(\u0026mut self, code: CloseCode, reason: String) {\n        trace!(\n            \"on_close code = {}, reason = {reason}\",\n            Into::\u003cu16\u003e::into(code)\n        );\n    }\n\n    /// ping消息收到, 将会自动返回pong消息\n    async fn on_ping(\u0026mut self, data: Vec\u003cu8\u003e) -\u003e NetResult\u003cOption\u003cVec\u003cu8\u003e\u003e\u003e {\n        trace!(\"on_ping\");\n        Ok(Some(data))\n    }\n\n    /// pong消息\n    async fn on_pong(\u0026mut self, data: Vec\u003cu8\u003e) -\u003e NetResult\u003c()\u003e {\n        let _data = data;\n        trace!(\"on_pong\");\n        Ok(())\n    }\n\n    /// message信息收到\n    async fn on_message(\u0026mut self, msg: Message) -\u003e NetResult\u003c()\u003e {\n        let _ = msg;\n        Ok(())\n    }\n\n    async fn on_request(\u0026mut self, req: Request\u003cVec\u003cu8\u003e\u003e) -\u003e NetResult\u003cResponse\u003cVec\u003cu8\u003e\u003e\u003e {\n        WsHandshake::build_request(\u0026req)\n    }\n\n    async fn on_response(\u0026mut self, res: Request\u003cVec\u003cu8\u003e\u003e) -\u003e NetResult\u003c()\u003e {\n        let _ = res;\n        Ok(())\n    }\n}\n\n\n```\n\n## 服务端监听\n\n#### tcp监听\n```rust\nNetConn::tcp_bind(\"0.0.0.0:2003\", Settings::default()).await\n```\n\n#### ws监听\n```rust\nNetConn::ws_bind(\"0.0.0.0:2003\", Settings::default()).await\n```\n\n#### wss监听\n监听时将证书信息配置即可轻松的支持wss协议\n```rust\nlet mut settings = Settings {\n    domain: Some(\"test.wmproxy.net\".to_string()),\n    cert: Some(\"key/example.com.pem\".to_string()),\n    key: Some(\"key/example.com.key\".to_string()),\n    ..Settings::default()\n};\nNetConn::ws_bind(\"0.0.0.0:2003\", settings).await\n```\n\n#### kcp(udp)监听\n```rust\nNetConn::kcp_bind(\"0.0.0.0:2003\").await\n```\n基本上监听和一般的socket监听一致，复杂程度类似，即可任意切换任何协议。\n\n### 服务端启动监听\n```rust\nlet h = conn.run_handler(|_| ServerHandler).await.unwrap();\nlet _ = tokio::join!(h);\n```\n具体示例可参考[server_echo](./examples/server_echo.rs)\n\n## 客户端连接\n\n#### tcp连接\n```rust\nNetConn::tcp_connect(\"127.0.0.1:2003\").await\n```\n\n#### ws连接\n```rust\nNetConn::ws_connect(\"ws://example.com:2003\").await\n```\n\n#### wss连接\n```rust\nNetConn::ws_connect(\"wss://example.com:2003\").await\n```\n\n#### kcp(udp)连接\n```rust\nNetConn::kcp_connect(\"wss://example.com:2003\").await\n```\n\n### 客户端启动监听\n```rust\nlet (mut sender, receiver) = NetSender::new(10, 1);\nlet _ = conn.run_with_handler(\n        ClientHandler {\n            sender: sender.clone(),\n        },\n        receiver,\n    ).await;\n```\n或者\n```rust\nlet _ = conn.run_handler(|sender| ClientHandler { sender }).await;\n```\n\n具体示例可参考[client_echo](./examples/client_echo.rs)\n\n\n## 启动demo\n先启动服务端\n```bash\ncargo run --example server_echo tcp\n```\n再启动客户端\n```bash\ncargo run --example client_echo tcp\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhcengine%2Fhcnet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhcengine%2Fhcnet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhcengine%2Fhcnet/lists"}