InChat 一个IM通讯框架

  一个轻量级、高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架。(核心底层Netty)

  版本目标:完成基本的消息通讯(仅支持文本消息),离线消息存储,历史消息查询,一对一聊天、自我聊天、群聊等。

  你可以使用InChat,快速搭建一个基于SpringBoot的IM项目,而且没有任何硬性要求,你完全可以兼容自己原有的项目。

  v1.0.0版本使用说明

  关于InChat的Maven依赖

  fastjson 》 1.2.53

  gson 》 2.8.5

  netty 》 4.1.32.Final

  commons-lang 》 3.5

  aspectj 》 1.9.2

  lombok 》 1.18.4

  spring-boot 》 2.0.2.RELEASE

  spring-boot-starter-websocket

  关于一版依旧使用SpringBoot的环境,同时为应用注入了web环境,引入InChat依赖包后,对于SpringBoot相关的web可以无需引入,同时请注意相关版本的兼容性。

  引入InChat默认可以自动运行web环境。

  创建项目

  创建一个空的Maven项目,并引入InChatMaven包,(注意,请不要使用与本项目相同的包目录)。

  可能你只需要这样的Maven依赖即可

  com.github.UncleCatMySelf

  InChat

  1.0-alpha

  org.springframework.boot

  spring-boot-starter-test

  test

  注入InChat的项目到自身项目中

  你可能需要在你的项目上进行报扫描

  @SpringBootApplication

  @ComponentScan({com.inchat}) //你的demo包目录

  @ComponentScan({com.github.unclecatmyself}) //InChat的包目录 --请将InChat的放到最下面

  public class DemoApplication {

  public static void main(String[] args) {

  SpringApplication.run(DemoApplication.class, args);

  }

  }

  对接InChat的接口与实现

  这次你仅需写两个实现接口即可啦!!!

  @Service

  public class ToDataBaseServiceImpl implements InChatToDataBaseService{

  @Override

  public Boolean writeMapToDB(Map maps) {

  //异步写入数据库

  System.out.println(maps.toString());

  return true;

  }

  }

  这个接口是每个人通讯的信息,InChat自带实现了异步的数据外抛得接口InChatToDataBaseService,目前一版只有一个方法,

  就是上面得writeMapToDB,你仅需要map的内容转为对应的对象(一版还没提供对应的转换类,下一版对提供),并将数据存入自己喜欢的数据库中。

  如果数据并发大,也可以先放到MQ中,再写入数据库。

  @Service

  public class verifyServiceImpl implements InChatVerifyService {

  @Override

  public boolean verifyToken(String token) {

  //登录校验

  return true;

  }

  @Override

  public JSONArray getArrayByGroupId(String groupId) {

  //根据群聊id获取对应的群聊人员ID

  JSONArray jsonArray = JSONArray.parseArray([\1111\,\2222\,\3333\]);

  return jsonArray;

  }

  }

  这个接口是InChat的校验层实现,对于Token的校验就是,verifyToken,websocket链接的时候,你将在初次做登录校验,你可以将从InChat拿到的websocket传过来的

  Token,你可以与自己的用户登录的token做校验,返回true,则用户成功链接InChat。

  关于getArrayByGroupId,目前是否应该放在这个接口中还有待确定,不过目前一版暂时这样,你可以去数据库中查询对应的群聊id所对应的人员ID(或Token),并返回对应的

  JSONArray即可啦。

  自定义配置InChat参数

  这个你可以直接在application中按照自己的意思配置,不过你最好先了解netty

  

  启动项目

  接着启动项目即可啦

  当你看到这个日志就标志着Inchat搭建成功了!!!

  2018-12-14 10:29:09.269 INFO 4920 --- [ BOSS_1] c.g.u.bootstrap.NettyBootstrapServer : 服务端启动成功【192.168.1.121:8090】

  关于前端

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

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

  关于前端的js暂时还是模板

  关于登录

  你会看到chat.html中的登录按钮对应的js

  function send(value) {

  if (!window.WebSocket) {

  return;

  }

  if (socket.readyState == WebSocket.OPEN) {

  var message = {

  type: login, //与InChat对应的 不可修改

  token: 1111

  }

  socket.send(JSON.stringify(message));

  } else {

  alert(连接没有开启.);

  }

  }

  本demo,默认登录的Token是“1111”,关于用户校验则直接返回true即可。

  登录成功,返回以下内容。(不需要显示给用户看)

  {success:true,type:login}

  InChat不会有登录记录

  发送给自己

  你会看到chat.html中的登录按钮对应的js

  function sendToMe(value) {

  if (!window.WebSocket) {

  return;

  }

  if (socket.readyState == WebSocket.OPEN) {

  var message = {

  type: sendMe, //与InChat对应的 不可修改

  value: value, //发送的内容

  token: 1111 //发送用户的token

  }

  socket.send(JSON.stringify(message));

  } else {

  alert(连接没有开启.);

  }

  }

  发送成功,InChat返回内容.(你仅需将value显示到前端即可)

  {type:sendMe,value:发送给自己的内容}

  InChat消息记录,你将在异步消息中接受到InChat传递给你的用户通讯消息,你可以进行对应的入库操作

  {time:2018-12-14 10:56:24,type:sendMe,value:发送给自己的内容,token:1111}

  发送给某人

  你会看到chat.html中的登录按钮对应的js

  function sendToOne(value) {

  if (!window.WebSocket) {

  return;

  }

  if (socket.readyState == WebSocket.OPEN) {

  var message = {

  type : sendTo, //与InChat对应的 不可修改

  token : 1111, //发送用户Token

  value: value, //发送内容

  one: 2222, //接受用户Token(唯一标识)

  }

  socket.send(JSON.stringify(message));

  } else {

  alert(连接没有开启.);

  }

  }

  发送成功,接受的用户是否登录,你都能接受到返回信息。(value应用于自己界面展示)

  {one:2222,type:sendTo,value:发送给朋友的内容}

  但是用户那边就不一样了。

  登录正常在线。

  {from:1111,type:sendTo,value:发送给朋友的内容}

  离线接受不到信息

  InChat异步消息推送,你可以看到两种

  在线: {one:2222,time:2018-12-14 11:01:36,type:sendTo,value:发送给朋友的内容,token:1111}

  离线: {one:2222,time:2018-12-14 10:59:04,on_online:2222,type:sendTo,value:发送给朋友的内容,token:1111}

  如果出现用户发送给用户的状态是离线的,则会在消息多出on_online的字段,该字段的内容就是离线用户的Token,你可以针对性的数据入库,并在用户上线的时候,读写信息的时候,有一个未读消息的状态。

  发送群聊

  你会看到chat.html中的登录按钮对应的js

  function sendGroup(value) {

  if (!window.WebSocket) {

  return;

  }

  if (socket.readyState == WebSocket.OPEN) {

  var message = {

  type: sendGroup, //与InChat对应的 不可修改

  groupId: 2, //群聊ID

  token: 1111, //发送用户的Token

  value: value //发送的消息

  }

  socket.send(JSON.stringify(message));

  } else {

  alert(连接没有开启.);

  }

  }

  发送成功,本人将接受到消息

  {groupId:2,from:1111,type:sendGroup,value:大家明天一起去唱K吧}

  群组中有些人在线接受、离线不接受

  在线:{groupId:2,from:1111,type:sendGroup,value:大家明天一起去唱K吧}

  InChat异步消息入库,群组只会异步给你一个消息,你可以看到on_online中,3333用户是没有接受到信息的,所以你可以在他上线发送未读消息。

  {groupId:2,time:2018-12-14 11:09:17,on_online:[3333],type:sendGroup,value:大家明天一起去唱K吧,token:1111}

  关于数据库设计

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

  前端效果

  发送人

  

  接收人

  

  

InChat版,仅仅两个接口实现自己的IM系统(可兼容)的更多相关文章

  1. opencv源码阅读之——iOS的两条接口UIImageToMat()和MatToUIImage()

    本文为作者原创,未经允许不得转载:原文由作者发表在博客园: http://www.cnblogs.com/panxiaochun/p/5387743.html 在ios下开发基于opencv的程序时经 ...

  2. MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  3. MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  4. MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  5. MVC5+EF6 简易版CMS(非接口) 第一章:新建项目

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  6. zw版_Halcon图像库delphi接口文件

    zw版_Halcon图像库delphi接口文件 Halcon图像库delphi接口文件,根据安装时用户设置的文件目录不同,会有所差异,笔者一般安装在delphi的import目录下.     参见:& ...

  7. SOA两个接口通常用于实现更:SOAP vs REST

    SOA协作架构异构系统,因此,一个跨操作系统的需求.跨语言的通用信息交换格公式. SOAP和REST它们是基于消息正文文本,在跨平台方面相比二进制消息优点.因此,作为选择SOA实施通常用于界面.但SO ...

  8. 深入Callable及Runnable两个接口 获取线程返回结果

    今天碰到一个需要获取线程返回结果的业务场景,所以了解到了Callable接口. 先来看下下面这个例子: public class ThreadTest { public static void mai ...

  9. vue-element-ui upload组件调用两次接口

    在使用upload中,默认是自动上传,会发现会调用两次接口,一次是Request Method: OPTIONS且不带任何参数(群里大佬说是跨域 预检测),一次是Request Method: POS ...

随机推荐

  1. APPIUM Android 定位方式

    原文地址https://www.cnblogs.com/sundalian/p/5629500.html 1.定位元素应用元素 1.1通过id定位元素 Android里面定位的id一般为resrouc ...

  2. jquery 的each函数

    each函数经常用到.它本身就是一个循环遍历 你可以可以break continue 但这是在for while循环中 each中我们可以这样 下面的例子是遍历 MyTable中所有的tr 第一个td ...

  3. 浅谈Java中的初始化和清理

    引言 这篇文章我们主要介绍Java初始化和清理的相关内容,这些内容虽然比较基础,但是还是在这边做一个简单的总结,方便以后查阅. 初始化过程 Java尽力保证:所有变量在使用之前都会得到恰当的初始化(对 ...

  4. liferay总结的通用的工具类

    在写增删改查的时候,自己动手写了几个通用的工具类,这几个通用的工具类也是基于API写的 第一个是liferay中的分页.跟我们做普通的web开发,分页是一样的首先需要建立一个分页的实体的类 packa ...

  5. centos6更改密码

    创建新用户 创建一个用户名为:zhangbiao [root@localhost ~]# adduser zhangbiao 为这个用户初始化密码,linux会判断密码复杂度,不过可以强行忽略: [r ...

  6. 无法在web服务器下启动调试

    VS2013 编译时异常 无法在web服务器下启动调试.该Web服务器未及时响应   VS2013 编译时错误 无法在web服务器上启动调试.该Web服务器未及时响应.无法在web服务器上启动调试.该 ...

  7. Devenv 命令行开关

    Devenv 可用来设置集成开发环境 (IDE) 的各个选项,以及从命令行生成.调试和部署项目.使用这些开关从脚本或 .bat 文件(例如每夜生成的脚本)运行 IDE,或以特定配置启动 IDE. 说明 ...

  8. 命名空间“Microsoft.Office.Interop”中不存在类型或命名空间名称“Excel”。是否缺少程序集引用 的另一种解决方案

    一直以来都是使用tfs进行源代码管理,系统部署也是由我本机生成后发布到服务器上,某一日,进行发布操作时,报了 [命名空间“Microsoft.Office.Interop”中不存在类型或命名空间名称“ ...

  9. linux常用命令:killall 命令

    killall命令用进程的名字来杀死进程. 1.命令格式:    killall [ -egiqvw ] [ -signal ] [进程名称] 格式:killall -<signame> ...

  10. Linux服务器---关闭selinux

    关闭selinux 1.通过命令“getenforce”获取selinux状态, [root@localhost ~]# getenforce Enforcing        //enforcein ...