InChat 一个IM通讯框架一个轻量级、高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架。(核心底层Netty)Github:InChat版本目标:完成基本的消息通讯(仅支持文本消息),离线消息存储,历史消息查询,一对一聊天、自我聊天、群聊等。你可以使用InChat,快速搭建一个基于SpringBoot的IM项目,而且没有任何硬性要求,你完全可以兼容自己原有的项目。v1.0.0版本使用说明关于InChat的Maven依赖fastjson 》 1.2.53gson 》 2.8.5netty 》 4.1.32.Finalcommons-lang 》 3.5aspectj 》 1.9.2lombok 》 1.18.4spring-boot 》 2.0.2.RELEASEspring-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的接口与实现这次你仅需写两个实现接口即可啦!!!@Servicepublic class ToDataBaseServiceImpl implements InChatToDataBaseService{ @Override public Boolean writeMapToDB(Map<String, Object> maps) { //异步写入数据库 System.out.println(maps.toString()); return true; }}这个接口是每个人通讯的信息,InChat自带实现了异步的数据外抛得接口InChatToDataBaseService,目前一版只有一个方法,就是上面得writeMapToDB,你仅需要map的内容转为对应的对象(一版还没提供对应的转换类,下一版对提供),并将数据存入自己喜欢的数据库中。如果数据并发大,也可以先放到MQ中,再写入数据库。@Servicepublic 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中的登录按钮对应的jsfunction 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中的登录按钮对应的jsfunction 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中的登录按钮对应的jsfunction 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中的登录按钮对应的jsfunction 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的自项目。前端效果发送人接收人
...