{"id":15044551,"url":"https://github.com/1ssqq1lxr/rmessage","last_synced_at":"2025-04-10T00:42:25.651Z","repository":{"id":45421833,"uuid":"161048803","full_name":"1ssqq1lxr/Rmessage","owner":"1ssqq1lxr","description":"Reactive Programming Multi-protocol push service","archived":false,"fork":false,"pushed_at":"2021-12-14T21:16:12.000Z","size":338,"stargazers_count":25,"open_issues_count":10,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-10T00:41:54.327Z","etag":null,"topics":["im","java8","netty4","reactor-core","reactor-netty","reactor3","tcp","udp"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/1ssqq1lxr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-12-09T14:39:39.000Z","updated_at":"2024-11-25T08:18:53.000Z","dependencies_parsed_at":"2022-08-29T23:40:11.527Z","dependency_job_id":null,"html_url":"https://github.com/1ssqq1lxr/Rmessage","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1ssqq1lxr%2FRmessage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1ssqq1lxr%2FRmessage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1ssqq1lxr%2FRmessage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1ssqq1lxr%2FRmessage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/1ssqq1lxr","download_url":"https://codeload.github.com/1ssqq1lxr/Rmessage/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248137998,"owners_count":21053775,"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":["im","java8","netty4","reactor-core","reactor-netty","reactor3","tcp","udp"],"created_at":"2024-09-24T20:50:42.828Z","updated_at":"2025-04-10T00:42:25.631Z","avatar_url":"https://github.com/1ssqq1lxr.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 欢迎阅读Rmessage文档\n\n##  技术栈\nRmessage是采用Reactor3,基于reactor-netty项目构建的实时消息推送api。\n - 什么是Reactor3?\n \n   Reactor 是一个用于JVM的完全非阻塞的响应式编程框架，具备高效的需求管理（即对 “背压（backpressure）”的控制）能力。它与 Java 8 函数式 API 直接集成，比如 CompletableFuture， Stream， 以及 Duration。它提供了异步序列 API Flux（用于[N]个元素）和 Mono（用于 [0|1]个元素），并完全遵循和实现了“响应式扩展规范”（Reactive Extensions Specification）。\n - 使用Reactor好处?\n \n   非常容易构建高吞吐量纯异步的代码,还有就是能够无缝整合spring5[webflux]项目。\n\n##  项目简介\n使用Rmessage你需要外部管理群组用户关系,以及离线消息存储，Rmessage不提供持久化，测试可以使用默认Handler内存保留离线消息。\n整个项目采用纯异步的编程思想去开发，旨在学习reactive programming。\n\n- [码云地址](https://gitee.com/lxrzdy/Rmessage)\n- [github地址](https://github.com/1ssqq1lxr/Rmessage)\n\n##  目前支持的功能\n1. 单聊\n2. 群聊\n3. 离线消息落地以及拉取\n4. 离线在线通知管理\n5. 心跳,连接鉴权机制\n6. 群组关系管理\n7. 支持多端在线\n8. 目前支持tcp协议，项目设计时考虑多协议扩展。\n9. 支持服务端自定义消息拦截\n9. 消息QOS机制(还未实现)\n\n\n\n\n##  快速开始\n- **服务端**\n###### Rmessage不管理用户群组之间关系,通过接口暴漏外部，只要实现接口注入即可。\n\n```java\nServerStart\n   .builder()\n   .tcp()\n   .ip(\"127.0.0.1\")\n   .port(1888)\n   .onReadIdle(10000l) //设置读心跳时间\n   .onWriteIdle(10000l) //设置写心跳时间\n   .option(ChannelOption.SO_RCVBUF,1023)\n   .interceptor(frame -\u003e frame,frame -\u003e frame)// 拦截所有message\n   .setAfterChannelInit(channel -\u003e {//  channel设置\n      })\n   .connect()\n   .cast(TcpServerSession.class)\n   .subscribe(session-\u003e{\n                    session.addGroupHandler(groupId -\u003e null).subscribe();\n                    session.addOfflineHandler(new DefaultOffMessageHandler()).subscribe();\n                    session.addUserHandler(new DefaultUserTransportHandler());\n  });\n\n\n\n```\n #### 具体接口方法定义请参照接口注释\n\n 1. UserHandler接口是处理用户登陆校验等\n 2. OfflineHandler 是处理离线消息存储,以及拉取离线消息的接口\n 3. GroupHandler 是获取群组下所有用户的接口\n \n\n- **客户端**\n\n```java\n ClientStart\n     .builder()\n     .tcp()\n     .ip(\"127.0.0.1\")\n     .port(1888)\n     .userId(\"21344\")  //设置用户名\n     .password(\"12312\") //设置密码\n     .onReadIdle(10000l,()-\u003e()-\u003eSystem.out.println(\"心跳了\"))//设置读心跳,以及设置回调runner\n     .setClientType(ClientType.Ios)//设置客户端类型\n     .setAfterChannelInit(channel -\u003e {\n                    //  channel设置\n      })\n     .connect()\n     .cast(TcpClientSession.class)\n     .subscribe(session-\u003e{\n      session.sendPoint(\"123\",\"测试一下哦\").subscribe(); //发送单聊消息\n                    session.sendGroup(\"group1\",\"123\").subscribe();  // 发送群聊消息\n                    session.accept(message -\u003e {\n    }); // 接受所有消息\n  });\n```\n## 协议设计\n- **单聊  多聊**\n \nFixHeader  【1 byte】\n\n| client_type |  message_type |\n| --------   | :----:  |\n|  high 4bit       |  low 4bit      |\n\n Topic     【n byte】\n\n|  from length  |  to length  |  from   |   to |\n| ------------ | ------------ | ------------ | ------------ |\n|   1byte  |  1byte |  n byte  |    n byte |\n\n Body    【n byte】\n\n| body length    | body |\n| ------------- | ------------- |\n| 2 byte  | n byte  |\n\n| timstamp |\n| ------------- |\n| 8 byte    |\n\n\n- **Online报文**\n\nFixHeader  【1 byte】\n   \n   | client_type |  message_type |\n   | --------   | :----:  |\n   |  high 4bit       |  low 4bit      |\n\nConnectionState  【n byte】\n\n|  user length  |  password length  |  user   |   password |\n| ------------ | ------------ | ------------ | ------------ |\n|   1byte  |  1byte |  n byte  |    n byte |\n\n\n- **Offline报文**\n\nFixHeader  【1 byte】\n   \n   | client_type |  message_type |\n   | --------   | :----:  |\n   |  high 4bit       |  low 4bit      |\n\nConnectionState  【n byte】\n\n|  user length   |  user   |\n| ------------ | ------------ | \n|   1byte   |  n byte  | \n\n\n- **Ping报文/Pong报文**\n\nFixHeader  【1 byte】\n\n| client_type |  message_type |\n| --------   | :----:  |\n|  high 4bit       |  low 4bit      |\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F1ssqq1lxr%2Frmessage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F1ssqq1lxr%2Frmessage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F1ssqq1lxr%2Frmessage/lists"}