本文首发于本博客 猫叔的博客,转载请申明出处

2019 年 1 月 15 号 -InChat 发布 V1.1.3 版本

Image text

InChat : 一个轻量级、高效率的支持多端(应用与硬件 Iot)的异步网络应用通讯框架

一个轻量级、高效率的支持多端(应用与硬件 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 "CN=gornix.com" 设置 Common Name 为 gornix.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 {
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> Boolean <span class="hljs-title">writeMessage</span><span class="hljs-params">(InChatMessage message)</span> </span>{
    System.out.println(message.toString());
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
}

}

复制代码

登录校验与群聊消息

此接口没有做过多的修改

public class VerifyServiceImpl implements InChatVerifyService {
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">verifyToken</span><span class="hljs-params">(String token)</span> </span>{
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
}

<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> JSONArray <span class="hljs-title">getArrayByGroupId</span><span class="hljs-params">(String groupId)</span> </span>{
    JSONArray jsonArray = JSONArray.parseArray(<span class="hljs-string">"[\"1111\",\"2222\",\"3333\"]"</span>);
    <span class="hljs-keyword">return</span> jsonArray;
}

}

复制代码

服务端发送通知消息枚举类

此接口具有 Demo 模板,用户需要继承 InChat 框架的FromServerService接口,同时该接口注释也有实例 demo,我们需要实现一个自定义的枚举,你可以这样写:

public enum  FromServerServiceImpl implements FromServerService {
<span class="hljs-comment">//你可以自定义自己的系统消息,请以Integer-String的形式</span>
TYPE1(<span class="hljs-number">1</span>,<span class="hljs-string">"【系统通知】您的账号存在异常,请注意安全保密信息。"</span>),
TYPE2(<span class="hljs-number">2</span>,<span class="hljs-string">"【系统通知】恭喜您连续登录超过5天,奖励5积分。"</span>);

<span class="hljs-keyword">private</span> Integer code;

<span class="hljs-keyword">private</span> String message;

FromServerServiceImpl(Integer code, String message){
    <span class="hljs-keyword">this</span>.code = code;
    <span class="hljs-keyword">this</span>.message = message;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> Integer <span class="hljs-title">getCode</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> code;
}

<span class="hljs-comment">//实现接口的方法,遍历本枚举的code,获取对应的消息,作为系统消息发送</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">findByCode</span><span class="hljs-params">(Object code)</span> </span>{
    Integer codes = (Integer)code;
    <span class="hljs-keyword">for</span> (FromServerServiceImpl item: FromServerServiceImpl.values()) {
        <span class="hljs-keyword">if</span> (item.code == codes){
            <span class="hljs-keyword">return</span> item.message;
        }
    }
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setCode</span><span class="hljs-params">(Integer code)</span> </span>{
    <span class="hljs-keyword">this</span>.code = code;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getMessage</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> message;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setMessage</span><span class="hljs-params">(String message)</span> </span>{
    <span class="hljs-keyword">this</span>.message = message;
}

}

复制代码

启动项目

1.1.3 版本的启动项目变得异常的简单,你只需要配置启动的配置工厂即可。但是如果我们启动了分布式的话,我们还需要配置 redis 信息。

public class application {
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
    <span class="hljs-comment">//配置你的自定义配置</span>
    ConfigFactory.initNetty = <span class="hljs-keyword">new</span> MyInit();
    <span class="hljs-comment">//配置校验类</span>
    ConfigFactory.inChatVerifyService = <span class="hljs-keyword">new</span> VerifyServiceImpl();
    <span class="hljs-comment">//配置消息接收处理类</span>
    ConfigFactory.inChatToDataBaseService = <span class="hljs-keyword">new</span> DataBaseServiceImpl();
    <span class="hljs-comment">//配置服务端系统消息枚举,这里的值无所谓 TYPE1或者TYPE2或者TYPEN均可以</span>
    ConfigFactory.fromServerService = FromServerServiceImpl.TYPE1;
    <span class="hljs-comment">//配置分布式Redis地址,端口目前默认的,下一版可以支持修改。</span>
    ConfigFactory.RedisIP = <span class="hljs-string">"192.168.192.132"</span>;
    <span class="hljs-comment">//启动InChat</span>
    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 版本使用说明

send

result

前端相关

这里你可以来到InChat的 Front-End-Testing 文档夹中的 chat.html。

你可以直接使用,你进需要修改对应的对接 IP 即可。

如果你开了 SSL 加密,你的 IP 开头记得改为:wss://192.168.1.121:8090/ws !!!

前端可以看原来的版本: InChatV1.1.2 版本使用说明

关于数据库设计

当前一版不会固定大家的数据库设计,大家可以自己自由设计,同时搭上自己的项目,构建一个附带 IM 的自项目。

公众号:Java 猫说

现架构设计(码农)兼创业技术顾问,不羁平庸,热爱开源,杂谈程序人生与不定期干货。

Image Text

  • Java

    Java,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台的总称。用 Java 实现的 HotJava 浏览器(支持 Java applet)显示了 Java 的魅力:跨平台、动态的…

    380 引用 • 6 回帖
感谢    赞同    分享    收藏    关注    反对    举报    ...