InChat一版,仅仅两个接口实现自己的IM系统(可兼容)

4次阅读

共计 4664 个字符,预计需要花费 12 分钟才能阅读完成。

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{

@Override
public Boolean writeMapToDB(Map<String, Object> 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 的自项目。
前端效果
发送人

接收人

正文完
 0