{"id":18716469,"url":"https://github.com/seaswalker/netty-wheel","last_synced_at":"2025-04-12T13:31:11.535Z","repository":{"id":49964067,"uuid":"66648608","full_name":"seaswalker/netty-wheel","owner":"seaswalker","description":"简单netty轮子","archived":false,"fork":false,"pushed_at":"2021-06-07T17:48:14.000Z","size":82,"stargazers_count":19,"open_issues_count":2,"forks_count":16,"subscribers_count":4,"default_branch":"master","last_synced_at":"2023-02-28T04:32:04.113Z","etag":null,"topics":["netty","nio","reinvent-the-wheel"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seaswalker.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}},"created_at":"2016-08-26T13:08:58.000Z","updated_at":"2022-03-09T11:24:31.000Z","dependencies_parsed_at":"2022-08-23T16:50:34.404Z","dependency_job_id":null,"html_url":"https://github.com/seaswalker/netty-wheel","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seaswalker%2Fnetty-wheel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seaswalker%2Fnetty-wheel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seaswalker%2Fnetty-wheel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seaswalker%2Fnetty-wheel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seaswalker","download_url":"https://codeload.github.com/seaswalker/netty-wheel/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223518467,"owners_count":17158689,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["netty","nio","reinvent-the-wheel"],"created_at":"2024-11-07T13:12:47.242Z","updated_at":"2024-11-07T13:12:47.750Z","avatar_url":"https://github.com/seaswalker.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/seaswalker/netty-wheel.svg?branch=master)](https://travis-ci.org/seaswalker/netty-wheel)\n[![codecov](https://codecov.io/gh/seaswalker/netty-wheel/branch/master/graph/badge.svg)](https://codecov.io/gh/seaswalker/netty-wheel)\n\n# 实现的功能\n\n- channelActive/channelInActive/channelRead/channelWrite事件处理\n\n- HandlerInitializer \n\n- Handler链式处理\n\n- StringEncoder/StringDecoder\n\n- LengthFieldBasedDecoder\n\n- DelimiterBasedDecoder\n\n- LineBasedDecoder\n\n# 线程模型\n\n![ThreadMode](images/thread_mode.jpg)\n\n# 示例\n\n## 服务器启动\n\n以定长解码器为例:\n\n```java\n@Test\npublic void lengthFieldBasedDecoder() {\n    Server server = new Server();\n    server.bind(8080).setHandlers(new HandlerInitializer() {\n        @Override\n        public Handler[] init() {\n            return new Handler[] {new LengthFieldBasedDecoder(0, 4), \n                new StringDecoder(), new SimpleInBoundHandler()};\n        }\n    }).start();\n}\n```\n\n## SimpleInBoundHandler\n\n简单地打印出事件触发以及收到的消息:\n\n```java\npublic class SimpleInBoundHandler extends InBoundHandlerAdapter {\n    @Override\n    public void channelActive(HandlerContext context) {\n        System.out.println(\"channel active\");\n    }\n    @Override\n    public void channelInActive(HandlerContext context) {\n        System.out.println(\"channel inActive\");\n    }\n    @Override\n    public void channelRead(Object message, HandlerContext context) {\n        System.out.println(message.toString());\n    }\n}\n```\n\n## 客户端\n\n数据发送代码:\n\n```java\n@Test\npublic void lengthFieldBasedDecoder() throws IOException, InterruptedException {\n    byte[] result = new byte[35];\n    System.arraycopy(DataUtils.int2Bytes(31), 0, result, 0, 4);\n    System.arraycopy(\"org.apache.commons.lang.builder\".getBytes(), 0, result, 4, 31);\n    for (int i = 0; i \u003c 6; i++) {\n        bos.write(result);\n    }\n    TimeUnit.SECONDS.sleep(6);\n}\n```\n\n# TODO\n\n为了确保测试用例能够通过，使用了基于端口取余的worker线程分配方式，这样保证了向client发送数据的先后顺序。目前写功能很原始，只是将经过OutboundHandler处理的数据不做任何操作直接写入，这样的问题在于：\n1. OS写缓冲区满，写入失败\n2. OS缓冲区可用空间不足一次性写入，要分多次写入\n3. 客户端如果已断开或网络出问题怎么办，可能需要心跳检测之类的手段\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseaswalker%2Fnetty-wheel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseaswalker%2Fnetty-wheel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseaswalker%2Fnetty-wheel/lists"}