InChat一版,仅仅两个接口实现自己的IM系统(可兼容)
InChat 一个IM通讯框架
一个轻量级、高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架。(核心底层Netty)
Github:InChat
版本目标:完成基本的消息通讯(仅支持文本消息),离线消息存储,历史消息查询,一对一聊天、自我聊天、群聊等。
你可以使用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依赖即可
<dependencies><dependency><groupId>com.github.UncleCatMySelf</groupId><artifactId>InChat</artifactId><version>1.0-alpha</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
注入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{@Overridepublic Boolean writeMapToDB(Map<String, Object> maps) {//异步写入数据库System.out.println(maps.toString());return true;}
}
- 这个接口是每个人通讯的信息,InChat自带实现了异步的数据外抛得接口InChatToDataBaseService,目前一版只有一个方法,
就是上面得writeMapToDB,你仅需要map的内容转为对应的对象(一版还没提供对应的转换类,下一版对提供),并将数据存入自己喜欢的数据库中。
如果数据并发大,也可以先放到MQ中,再写入数据库。
@Service
public class verifyServiceImpl implements InChatVerifyService {@Overridepublic boolean verifyToken(String token) {//登录校验return true;}@Overridepublic JSONArray getArrayByGroupId(String groupId) {//根据群聊id获取对应的群聊人员IDJSONArray 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", //发送用户Tokenvalue: 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", //群聊IDtoken: "1111", //发送用户的Tokenvalue: 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系统(可兼容)相关推荐
- InChat版,仅仅两个接口实现自己的IM系统(可兼容)
InChat 一个IM通讯框架 一个轻量级.高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架.(核心底层Netty) 版本目标:完成基本的消息通讯(仅支持文本消息),离线消息存储,历史消息查 ...
- 拼多多客京东客蘑菇街小程序v9.1高佣联盟无限多开版 新增两个京东备用接口,故障自动切换接口 小程序
拼多多客京东客蘑菇街小程序v9.1高佣联盟无限多开版 新增两个京东备用接口,故障自动切换接口 小程序 [后端升级新版] 1.新增两个京东备用接口,故障自动切换接口. 学习资料源码:拼多多客京东客蘑菇街 ...
- 图书推荐|计算机组成与设计(原书第5版) 硬件软件接口 RISC-V
计算机组成与设计(原书第5版) 硬件软件接口 RISC-V 这本书是引进过来的,本系列图书广受盛誉,有两位"图灵奖"得主撰写,书的权威性及细致性不言而喻,两位作者的履历也是让我们 ...
- php银行支付教学课程,php版交通银行网银支付接口开发入门教程
本文实例讲述了php版交通银行网银支付接口实现方法.分享给大家供大家参考,具体如下: 概述:网银支付接口 和支付宝接口大体上差不多,主要的区别是 交通银行提供的 接口核心的比如,加密等是通过java实 ...
- 华为的mysql数据库如何登陆_华为云数据库GeminiDB高度兼容Redis和InfluxDB两大接口...
随着云端数据库的蓬勃发展,市面上涌现出越来越多的数据库,如何满足日益增长的客户需求,是每个云厂商必须考虑的问题.华为云数据库聚焦企业,致力于打造企业级数据库,为企业客户提供稳定可靠.安全可信.可持续创 ...
- 理解java中的两种接口
在java 中我们常常提高接口一词.在java 中有两中接口. 第一种接口:就是指系统对外提供的所有服务,在对象中表现为public类型的方法的声明.也就是我们常常在一个类中写的public的方法了. ...
- 使用SpringMVC创建支持向下兼容的版本化的API接口
2019独角兽企业重金招聘Python工程师标准>>> 原文:http://www.cnblogs.com/jcli/p/springmvc_restful_version.html ...
- Firefox 增强版 仅仅5.7 MB
Mozilla firefox,是由Mozilla基金会与火狐工作者所开发的一个轻便.快速.简单与高扩充性的网页浏览器.Firefox已经是Mozilla开发的焦点,是Mozilla基金会的官方浏览器 ...
- 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题
IOC概念和spring中的IOC 明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系). 使用 spring 的 IOC 解决程序耦合 获取spring的Ioc核心容器,并根据i ...
最新文章
- ES6常用新特性---笔记一
- 【Blog.Core重要升级】:封装服务扩展层
- anaconda-虚拟环境的控制-新建-切换-删除
- 剑指offer31-栈的压入、弹出序列
- Java基础篇:什么是递归?如何用递归?
- 输出halloword
- 全网首发:No package ‘usbutils‘ found
- c 打印二叉树_二叉树遍历(非递归和递归实现)
- 过来康康,一起来学VScode插件
- 服务器运行时狂响,服务器常见故障大全
- 助力不文明行为检测识别—基于yolov3-tiny实现抽烟检测
- 认知学派用计算机来比拟人,比拟:把人当物写或把物当人来写的一种修辞方法,前者称之为拟物,后者称之为拟人.如:①做人既不可翘尾巴,也不可夹着尾巴. ②蜡炬成灰泪始干....
- 《分形艺术,当科学嫁给了艺术》稿件撰写历程
- c语言do while例子,C语言do while循环
- 《全民学乒乓》学习笔记
- Ardunio开发实例-TEMT6000环境光传感器
- 给传智播客的一份感谢信
- 【绘画素材】Q版线稿参考,欢迎临摹嗷
- 京东618大促,全店快递如何批量打印
- VS 编译时 /MD 与 /MT、/MTD与/MDD的区别