2019 年 1 月 15 号 - InChat 发布 V1.1.3 版本
https://github.com/UncleCatMySelf/InChat
一个轻量级, 高效率的支持多端 (应用与硬件 Iot) 的异步网络应用通讯框架
v1.1.3 版本使用说明
v1.1.0-alpha 版本使用说明 InChatV1.1.2 版本使用说明
历史更新说明
1.1.2 版本
捕获未注册链接断开异常, 完善异常处理
修改项目启动流程, 仿 Selector 启动模式
添加 HTTP 接口三个: 发送通知消息,
获取在线用户数
,
获取在线用户列表
, 暂不支持用户自定义 HTTP 接口(对于传统 web API 我们希望用户用自己的框架与流程)
服务端发送通知接口改为 enum 处理
1.1.3 版本
添加 SSL 加密, 实现 https 与 wss 功能
接受用户自定义证书(浏览器信任与不信任均可以访问)
InChat 配置可改为分布式或着单机版
引入 Redis, 处理集群信息与消息互通
如果有生产需要或者个别需求, 发现 BUG, 欢迎留言, 项目会更新新的 API
关于 InChat 的 Maven 依赖
fastjson 》 1.2.53
gson 》 2.8.5
netty 》 4.1.32.Final
commons-lang 》 3.5
slf4j-log4j12 》 1.7.25
jedis 》 3.0.1
创建项目
创建一个空的 Maven 项目, 并引入 InChatMaven 包,(注意, 请不要使用与本项目相同的包目录).
可能你只需要这样的 Maven 依赖即可
- <dependencies>
- <dependency>
- <groupId>com.GitHub.UncleCatMySelf</groupId>
- <artifactId>InChat</artifactId>
- <version>1.1.3</version>
- </dependency>
- </dependencies>
对接 InChat 的接口与实现
InChat 启动参数可以自配置
你只需要继承 InChat 的默认配置类 InitNetty 即可, 如下
- public class MyInit extends InitNetty {
- /** 自定义启动监听端口 */
- @Override
- public int getWebport() {
- return 8090;
- }
- /** 是否启动分布式 true - 启动, false - 不启动 */
- @Override
- public Boolean getDistributed() {
- return true;
- }
- /** 是否启动加密功能 */
- @Override
- public boolean isSsl() {
- return true;
- }
- }
请注意, 分布式为测试版, 所以暂不支持 SSL 加密, 如果启动分布式请关闭 SSL 加密功能
如何自定义证书?
#keytool -genkey -keysize 2048 -validity 365 -keyalg RSA -dnam e "CN=in-chat.cn" -keypass 123456 -storepass 123456 -keystore inchat.jks
keytool 为 JDK 提供的生成证书工具
keysize 2048 密钥长度 2048 位(这个长度的密钥目前可认为无法被暴力破解)
validity 365 证书有效期 365 天
keyalg RSA 使用 RSA 非对称加密算法
dname "http://CN=gornix.com" 设置 Common Name 为 gornix.com http://xn--Namegornix-1x2p.com , 这是我的域名
keypass 654321 密钥的访问密码为 123456
storepass 123456 密钥库的访问密码为 123456(其实这两个密码也可以设置一样, 通常都设置一样, 方便记)
keystore gornix.jks 指定生成的密钥库文件为 inchat.jks
如果你试着自己创建了自己的证书, 那么你需要去重写 InitNetty 中的几个信息: jksFile,jksStorePassword,jksCertificatePassword. 你的 jks 文件只需要放到 resources 目录下就好, 两个密码就是你之前设定相同的密码. 本项目已经提供了默认的 inchat.jks, 请用户在 Maven 包中复制并粘贴到自己的项目中的 resources 文件夹中即可.
获取聊天消息数据
此接口与原先一样, 仅修改了方法名
- public class DataBaseServiceImpl implements InChatToDataBaseService {
- @Override
- public Boolean writeMessage(InChatMessage message) {
- System.out.println(message.toString());
- return true;
- }
- }
登录校验与群聊消息
此接口没有做过多的修改
- public class VerifyServiceImpl implements InChatVerifyService {
- @Override
- public boolean verifyToken(String token) {
- return true;
- }
- @Override
- public JSONArray getArrayByGroupId(String groupId) {
- JSONArray jsonArray = JSONArray.parseArray("[\"1111\",\"2222\",\"3333\"]");
- return jsonArray;
- }
- }
服务端发送通知消息枚举类
此接口具有 Demo 模板, 用户需要继承 InChat 框架的 FromServerService 接口, 同时该接口注释也有实例 demo, 我们需要实现一个自定义的枚举, 你可以这样写:
- public enum FromServerServiceImpl implements FromServerService {
- // 你可以自定义自己的系统消息, 请以 Integer-String 的形式
- TYPE1(1,"[系统通知] 您的账号存在异常, 请注意安全保密信息."),
- TYPE2(2,"[系统通知] 恭喜您连续登录超过 5 天, 奖励 5 积分.");
- private Integer code;
- private String message;
- FromServerServiceImpl(Integer code, String message){
- this.code = code;
- this.message = message;
- }
- public Integer getCode() {
- return code;
- }
- // 实现接口的方法, 遍历本枚举的 code, 获取对应的消息, 作为系统消息发送
- public String findByCode(Object code) {
- Integer codes = (Integer)code;
- for (FromServerServiceImpl item: FromServerServiceImpl.values()) {
- if (item.code == codes){
- return item.message;
- }
- }
- return null;
- }
- public void setCode(Integer code) {
- this.code = code;
- }
- public String getMessage() {
- return message;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- }
启动项目
1.1.3 版本的启动项目变得异常的简单, 你只需要配置启动的配置工厂即可. 但是如果我们启动了分布式的话, 我们还需要配置 Redis 信息.
- public class application {
- public static void main(String[] args) {
- // 配置你的自定义配置
- ConfigFactory.initNetty = new MyInit();
- // 配置校验类
- ConfigFactory.inChatVerifyService = new VerifyServiceImpl();
- // 配置消息接收处理类
- ConfigFactory.inChatToDataBaseService = new DataBaseServiceImpl();
- // 配置服务端系统消息枚举, 这里的值无所谓 TYPE1 或者 TYPE2 或者 TYPEN 均可以
- ConfigFactory.fromServerService = FromServerServiceImpl.TYPE1;
- // 配置分布式 Redis 地址, 端口目前默认的, 下一版可以支持修改.
- ConfigFactory.RedisIP = "192.168.192.132";
- // 启动 InChat
- InitServer.open();
- }
- }
项目效果
启动成功
- DEBUG - -Dio.netty.threadLocalDirectBufferSize: 0
- DEBUG - -Dio.netty.maxThreadLocalCharBufferSize: 16384
INFO - 服务端启动成功[192.168.56.1:8090]
INFO - [RedisConfig.getJedis]: 连接成功, 测试连接 PING->PONG
如果你开通了分布式, 那么你可以试着启动两个应用程序.
- DEBUG - -Dio.netty.threadLocalDirectBufferSize: 0
- DEBUG - -Dio.netty.maxThreadLocalCharBufferSize: 16384
INFO - 服务端启动成功[192.168.56.1:8070]
INFO - [RedisConfig.getJedis]: 连接成功, 测试连接 PING->PONG
读者可以到项目中使用原来的两个前端页面.
分别登录两个用户在两个应用程序, 并进行互相通信即可. 启动分布式请关闭 SSL, 分布式为测试版, 暂不支持 SSL
目前, 分布式版本接通了点对点与群聊的功能, 大家可以试试. 下一版本会添加一个分布式的组件用来统一数据与接口功能.
关于加密的, 请提前让电脑认同信任证书
关于分布式的操作效果
关于 HTTP 接口的, 目前与分布式无关
原先的自我发送, 点对点发送, 群聊, 异常处理, HTTP 接口均与原来一样
原先的接口说明可以看上一版本: InChatV1.1.2 版本使用说明
前端相关
这里你可以来到 https://github.com/UncleCatMySelf/InChat 的 Front-End-Testing 文档夹中的 chat.html.
你可以直接使用, 你进需要修改对应的对接 IP 即可.
如果你开了 SSL 加密, 你的 IP 开头记得改为: wss://192.168.1.121:8090/ws !!!
前端可以看原来的版本: InChatV1.1.2 版本使用说明
关于数据库设计
当前一版不会固定大家的数据库设计, 大家可以自己自由设计, 同时搭上自己的项目, 构建一个附带 IM 的自项目.
公众号: Java 猫说
现架构设计 (码农) 兼创业技术顾问, 不羁平庸, 热爱开源, 杂谈程序人生与不定期干货.
来源: https://juejin.im/post/5c3d86e1e51d4539b927db37