InChat版,仅仅两个接口实现自己的IM系统(可兼容)
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系统(可兼容)的更多相关文章
- opencv源码阅读之——iOS的两条接口UIImageToMat()和MatToUIImage()
本文为作者原创,未经允许不得转载:原文由作者发表在博客园: http://www.cnblogs.com/panxiaochun/p/5387743.html 在ios下开发基于opencv的程序时经 ...
- MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- MVC5+EF6 简易版CMS(非接口) 第一章:新建项目
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- zw版_Halcon图像库delphi接口文件
zw版_Halcon图像库delphi接口文件 Halcon图像库delphi接口文件,根据安装时用户设置的文件目录不同,会有所差异,笔者一般安装在delphi的import目录下. 参见:& ...
- SOA两个接口通常用于实现更:SOAP vs REST
SOA协作架构异构系统,因此,一个跨操作系统的需求.跨语言的通用信息交换格公式. SOAP和REST它们是基于消息正文文本,在跨平台方面相比二进制消息优点.因此,作为选择SOA实施通常用于界面.但SO ...
- 深入Callable及Runnable两个接口 获取线程返回结果
今天碰到一个需要获取线程返回结果的业务场景,所以了解到了Callable接口. 先来看下下面这个例子: public class ThreadTest { public static void mai ...
- vue-element-ui upload组件调用两次接口
在使用upload中,默认是自动上传,会发现会调用两次接口,一次是Request Method: OPTIONS且不带任何参数(群里大佬说是跨域 预检测),一次是Request Method: POS ...
随机推荐
- 面试官说:说一说CommonJs的实现原理
其实刚看到这个题目的时候,我的内心是拒绝的,但是本着对科学的敬畏精神,我开始了 CommonJs 的探索之路. 来来来奉上我这几天的心血,拿走不客气.如有错误欢迎指正,共同进步. 提到CommonJs ...
- 如何提取app软件的apk格式中的字体?
1.下载apk格式的指定app软件: 2.将apk格式的文件名更改为后缀名为zip格式: 3.用winrar解压软件解压,然后就找到其中的ttf格式的字体文件. 举例说明,我想找到airbnb的app ...
- Lower Power with CPF(三)
常用的一些Lower Power的策略: 1)Clock tree optimization and clock gating:在正常情况下clock信号会一直toggle at the maximu ...
- Linux中顿号
``的作用是运行``之间的命令,并且将命令运行的结果返回.一般shell脚本应该是这样:result=`ls -l` (用你的命令替换ls -l,这里只是举例)这样,result就有``里面的运行结果 ...
- 持续集成之三:搭建Maven私服Nexus
安装环境 Red Hat Enterprise Linux Server release 7.3 (Maipo) jdk1.7.0_80 apache-tomcat-7.0.90 mysql-5.7. ...
- 数据仓库基础(十二)Informatica组件(2)
本文转载自:http://www.cnblogs.com/evencao/p/3152708.html 1.Router Transformation:在filter 组件中只能写一个过滤条件.而在R ...
- python webdriver api-上传文件的三种方法
上传文件: 第一种方式,sendkeys(),最简单的 #encoding=utf-8 from selenium import webdriver import unittest import ti ...
- APP开发项目思维导图
APP开发项目思维导图 下载思维导图:APP开发项目.xmind.zip --------------------------------------- APP开发项目 app项目标记: 未启动 功能 ...
- LabVIEW如何方便地调用DLL文件
转自:http://bbs.elecfans.com/jishu_469502_1_1.html LabVIEW调用DLL文件 LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用.比 ...
- python之路----线程
线程概念的引入背景 进程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...