关键词:
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的自项目。
前端效果
发送人
接收人
?
im系统中聊天记录模块的设计与实现
...选择是从本地加载、还是从服务器加载。这样做的好处有两个:(1)从本地加载聊天记录速度非常快。(2)当更 查看详情
我的改进版2048之智能自己主动
...自己主动操作。但因为还不够优化,效果一般,最后大概仅仅能达到512.玩2048的朋友大概玩一两次之后就会发现诀窍:将大的数字往一个角落里移动(比方说左上角)。以两个方向为主,有一个方向不到万不得已不选择它。大概... 查看详情
教你自己动手打造称心如意的windows10纯净安装版系统!
...置,感觉多少有些麻烦。自己写个应答文件、利用Windows接口和应答文件接口,再安装几个小工具软件其中包括KMS激活、MVC++、DX9C、RAR等等..实现自动安装、品牌机自动添加LOOG等目的!下面就开始练!我自己定义为是WIM整合!1、i... 查看详情
一种可灰度的接口迁移方案
...能就涉及到系统架构的升级。系统升级往往包含最基础的两个部分 查看详情
js门面模式
...式不同的是:桥接模式中的各个类是全然独立的,桥接模式仅仅在必要的时候将这些类关联起来. 门面模式则有点不同.门面模式事实上能够非常形象的比作是一家咖啡店的店面窗体,客户仅仅须要说明自己是须要哪种咖啡,也就是... 查看详情
若依管理系统(前后端分离版)部署并实现持续发布(代码片段)
...管理控制台,选择【springboot】镜像创建主机。如果你仅仅想 查看详情
java优化版用接口实现(输入两个数选择实现加减乘除运算)(代码片段)
//利用java接口实现计算器,实现加减乘除的功能importjava.util.Scanner;classTestpublicstaticvoidmain(String[]args)funi=newfun();jiafas1=newjiafa();jianfas2=newjianfa();chengfas3=newchengfa();chufas4=newchufa();System.out 查看详情
saperp啥叫系统状态和用户状态?
事实上,用户状态功能之所以重要,不仅仅是因为此功能可以实现状态管理的定制化,更是因为通过它可以实现定制状态与系统状态的集成。SAP系统允许我们在定义用户状态时,将这些用户状态与系统预先定义好的系统状态进行... 查看详情
.net中怎样实现json转化时仅仅处理部分属性二?
在第一篇文章中使用的json方法。能够依照须要仅仅处理须要的属性,但却要求属性不能是复杂的类型,比如泛型,数组。其它用户自己定义的类等,限制太多,于是自己看看能不能改进,想不到Newtonsoft.Json提供有相关的接口,... 查看详情
在java中,接口只是定义了一个方法名,并没有方法体。那实现接口有啥用呢。仅仅只是需要一个方法名吗?
哈哈,实现接口,当然是实现接口里面的方法了。不同的类实现同一个接口,方法名虽然是一样的,但方法体肯定不会一样。这就叫多态。比如猫和狗都是动物,动物这个接口类中有一个吃的抽象方法,猫和狗实现了动物类,猫... 查看详情
使用websocket实现消息推送
...Socket上联系客服功能在项目中很难避免,一般有下面三种实现方式:使用http的get方式轮询接入第三方IM系统自己的IM系统基于socket基于websocket第一种方式,最low的,实现简单,但是浪费用户流量;第二种方式,接入简单,功能强... 查看详情
08.xml处理之dom编程
...到xml.dom的API结构如下。 NodeFilter#NodeFilter接口,仅仅提供常量定义 domreg#不直接使用,提供DOM实现访问接口。 expatbuilder# minicompat minidom#dom的实现方式之一 pulldom#dom的实现... 查看详情
taobao_api项目开坑,自主完成淘宝主要接口的开发-版本:卖家版(非淘宝api)
...淘宝操作的相关api,不依赖淘宝提供的api,而是自己实现接口前期实现接口:已付款订单查询(自动更新),订单发货,订单备注应用场景:中小型虚拟店铺,可实现自动发货项目使用工具:1,开发环境:win-xp python2.7.9 ... 查看详情
10设计模式策略模式
...向接口编程)。举例:我们就以Java中的TreeSet为例,TreeSet仅仅知道它只是接收一个Comparator这种接口类型,但是具体是哪种实现类,TreeSet并不关心,实现类在真正的传入TreeSet之前,TreeSet本身是不知道的,所以我们可以自己去实现C... 查看详情
注解开发(代码片段)
使用注解开发面向接口编程-大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程-根本原因:解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得... 查看详情
适配器模式(接口)
...一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。二、优点 更好的复用性 系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用... 查看详情
ghost版win7安装
...在,里面只有一个操作系统和一些简单必要的驱动,安装仅仅能够开机显示等简单操作,需要自己安装别的驱动,如声卡、显卡 查看详情
serializable是接口吗?publicclassdeletebeanimplementsserializable这个类去实现它有啥作用?
Serializable是序列化接口。而且是一个标志接口,就是接口里什么也没有,空的。序列化的意思就是将一个对象在内存里的形态记录,让它可以存在文件中,也可以方便的在网络中传输但是序列化的代价是非常高的,所以需要有一... 查看详情