基于InChat的SpringBoot版本通讯聊天数据存储Demo,附带详细流程说明
阅读本文约“10分钟”
适读人群:java初级
前言
InChat = Iot Netty Chat
首先,感谢那些一直以来支持InChat的朋友们,你们可能是因为工作原因,或者自己的想法,或者自己的项目等等。
InChat还不是一个合格的框架,它还存在很多弊端与问题,但是感谢你们的关注,也是你们让它学会成长。
重新声明一次,InChat:一个轻量级、高效率的支持多端(应用与硬件Iot)的可分布式、异步网络应用通讯框架。
InChat从1月1.1.3版本后,就停止了更新,期间由于个人原因(我后续也不敢保证它的连贯性),当时在8月22号,InChat发布1.1.4版本,且在9月份预计也会继续发布1.1.5版本(由于1.1.4发现了一些核心问题)
接下来,我将详细介绍1.1.4版本下的一些基本功能,欢迎大家测试,并在这里提出你们的看法或者问题。
InChat版本
<dependency><groupId>com.github.UncleCatMySelf</groupId><artifactId>InChat</artifactId><version>1.1.4</version>
</dependency>
构建SpringBoot的web项目
由于在停更期间,很多朋友都问到InChat在SpringBoot等web框架下的使用问题及想法,所以这个Demo是完全在SpringBoot环境下搭建的。
下载地址:InChat-SpringBoot-Demo,项目中demo-inchat-4.zip文件
这里建议大家可以直接敲一次,看看有什么问题。
首先,我的项目是SpringBoot-Web,数据库是MySQL,没有使用Redis
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo-inchat-4</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-inchat-4</name>
<description>Demo project for Spring Boot</description><properties>
<java.version>1.8</java.version>
</properties><dependencies><dependency>
<groupId>com.github.UncleCatMySelf</groupId>
<artifactId>InChat</artifactId>
<version>1.1.4</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build></project>
关于pom文件,大家需要注意的是InChat版本其实是自带log4j,因此可能会和其他的日志组件有冲突,需要移除,这个在1.1.5版本也将移除。
如果大家在使用InChat期间报:
Exception in thread "main" java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath.
可以按照以上移除对应的日志组件。
账户登录
基本的数据关系
Message 聊天消息类
@Entity
@Data
@DynamicUpdate
public class Message {/**id,自增*/@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;/** 消息时间 */private Date time;/** 消息类型(发送给自己、发送给朋友、发送给群组) */private String type;/** 消息值(聊天内容) */private String value;/** 用户标识(登录token) */private String token;/** 群聊Id */private String groudId;/** 是否在线-个人(朋友是否在线) */private String online;/** 是否在线-群聊(离线朋友) */private String onlineGroup;/** 消息接收人标识(接收朋友Token) */private String one;}
User 用户登录(简单模拟)
public class User {/**id*/@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String username;private String password;}
JPA
这里就简单用JPA处理,喜欢用MyBatis的朋友也可以试试,欢迎贡献Demo
启动类
为什么突然说到启动类呢?
因为,InChat(1.1.3之前都是在启动类,启动的),这可能是一个误解,在本次Demo中咱们的启动类是这样的。
@SpringBootApplication
@EnableScheduling
public class DemoInchat4Application {public static void main(String[] args) {SpringApplication.run(DemoInchat4Application.class, args);}}
是的,就这样,在我的这个业务里,并没有打算一开始就启动InChat,当然这还是要看业务而定
Controller层
这里的Controller就是一个常规启动http接口,启动默认InChat服务。
@RestController
public class UserController {@Autowiredprivate UserRepository repository;@GetMapping("/init")public String init(){ConfigFactory.initNetty = new MyInit();ConfigFactory.fromServerService = FromServerServiceImpl.TYPE2;ConfigFactory.listenAsynData = new UserListenAsynData();ConfigFactory.inChatVerifyService = new VerifyServiceImpl(repository);InitServer.open();return "success";}}
大家会发现,我通过一个http启动InChat,同时将一个UserRepository注入到InChat的校验类里面。
启动。
2019-08-23 17:10:52.399 INFO 20136 --- [ BOSS_1] c.g.u.bootstrap.NettyBootstrapServer : 服务端启动成功【192.168.1.121:8070】
接下来介绍下InChat的几个配置类
InChat配置类——InitNetty
继承 InitNetty
它是初始化Netty的基本配置,你可以根据你的需要的修改配置
public class MyInit extends InitNetty {@Overridepublic int getWebport() {return 8070;}//分布式@Overridepublic Boolean getDistributed() {return false;}//加密@Overridepublic boolean isSsl() {return false;}
InChat配置类——FromServerService
实现 FromServerService
这个与InChat1.1.3版本没有差别,是一个服务器发送的系统通知,可以通过Http发送任务
public enum FromServerServiceImpl implements FromServerService {TYPE1(1,"【系统通知】您的账号存在异常,请注意安全保密信息。"),TYPE2(2,"【系统通知】恭喜您连续登录超过5天,奖励5积分。");private Integer code;private String message;FromServerServiceImpl(Integer code, String message){this.code = code;this.message = message;}public Integer getCode() {return code;}public String findByCode(Object code) {Integer codes = (Integer)code;for (FromServerServiceImpl item: FromServerServiceImpl.values()) {if (item.code == codes){return item.message;}}return null;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}}
InChat配置类——ListenAsynData
继承 ListenAsynData
异步数据获取,就是聊天数据获取的类,在1.1.4中,你需要自己写一个载体(Map或者list)来存储聊天数据,我在这个Demo中使用Map,其实可以用list,需要注意,InChat中提供了一个将Map转为InChatMessage的工具类MessageChangeUtil, 我希望我的业务不是时刻存储数据,所以我将聊天数据存储到Map中,使用定时器,定时存储到数据库中。
public class UserListenAsynData extends ListenAsynData {@Overridepublic void asynData(Map<String, Object> maps) {InChatMessage inChatMessage = MessageChangeUtil.Change(maps);CacheMap.add(inChatMessage);}
}
InChat配置类——InChatVerifyService
继承 InChatVerifyService
你需要给这个类加一个静态变量,方便后续初始化后,做数据操作
这个类中的两个方法,一个是用户登录校验,一个是根据群聊ID获取群聊成员数组
这两个数据我都默认通过数据库处理,群聊ID我是直接模拟,大家可以在数据库中存储一个对应的表试试
public class VerifyServiceImpl implements InChatVerifyService {private UserRepository repository;public VerifyServiceImpl(UserRepository repository){this.repository = repository;}public boolean verifyToken(String token) {User user = repository.findByUsername(token);if (user.getId() != null){return true;}return false;}public JSONArray getArrayByGroupId(String groupId) {JSONArray jsonArray = JSONArray.parseArray("[\"1111\",\"2222\",\"3333\"]");return jsonArray;}
}
定时任务
我使用定时任务,定时存储聊天数据,这里需要注意,一定要清空存储过的内容
@Component
public class SchedulerTask {@Autowiredprivate MessageRepository repository;private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");@Scheduled(fixedRate = 30000)public void reportCurrentTime() {System.out.println("现在时间:" + dateFormat.format(new Date()));Map<Integer,InChatMessage> Chatcache = CacheMap.copy();InChatMessage inChatMessage = Chatcache.get(1);Message message = new Message();message.setOne(inChatMessage.getOne());message.setGroudId(inChatMessage.getGroudId());message.setOnline(inChatMessage.getOnline());message.setOnlineGroup(inChatMessage.getOnlineGroup());message.setToken(inChatMessage.getToken());message.setType(inChatMessage.getType());message.setValue(inChatMessage.getValue());message.setTime(inChatMessage.getTime());repository.save(message);}
}
我这里就简单意识一下
功能测试
单机模式下,发送给自己、发送给别人、发送给群组(单机,不加密)
正常运行,由于数据存储,我定时器只存储一条,大家记得修改下
单机,ssl加密,发送给自己、发送给别人、发送给群组(单机、加密)
关于加密,大家可以构建自己的加密文件,或者使用inchat.jks
大家可以参考InChatV1.1.3版本使用说明
生成自己的jks加密文件,请在 InitNetty类 的继承类中做对应的修改。
public abstract class InitNetty {//.../** 是否启动分布式 */private Boolean isDistributed = false;/** 是否启动加密 */private boolean ssl = false;private String jksFile = "inchat.jks";private String jksStorePassword = "123456";private String jksCertificatePassword = "123456";//....
}
分布式,发送数据
本Demo暂不测试,大家有兴趣可是在InChatV1.1.3版本使用说明中学习了解。
因为分布式使用后,两个Demo项目都会存在数据存储,这个不在InChat的设计范围,所以目前推荐大家先使用单机版本
后续的分布式,会有一个数据存储的中间云组件,集中处理聊天的数据存储问题等
InChat将继续发展。
墨花多态,琼浆Java酿
基于InChat的SpringBoot版本通讯聊天数据存储Demo,附带详细流程说明相关推荐
- 基于Linux下的即时通讯聊天室项目(全代码 有注释 可直接运行)
基于Linux下的即时通讯聊天室项目 一.序言 二.具体功能 三.系统客户要求 四.具体代码 1.服务器代码 2.客户端代码 一.序言 最近在写一个基于Linux下的聊天工具 它适合于局域网内所有人进 ...
- javauniapp+SpringBoot即时通讯聊天软件源码
uniapp+SpringBoot即时通讯聊天软件源码,前端使用uniapp,后端使用SpringBoot. 手机端使用uniapp实现,目前仅支持安卓端和iOS端,小程序端和H5端暂未做适配. 下载 ...
- 基于Android开发的即时通讯聊天app
基于Android开发的即时通讯聊天app 前言 即时通讯(Instant Messaging,简称IM)在互联网中应用十分广泛,它可以和很多的领域结合,发挥十分重要的作用.比如金融行业的支付宝.各大 ...
- Uniapp+SpringBoot即时通讯聊天安卓APP源码
Uniapp+SpringBoot即时通讯聊天安卓APP源码 ☑️ 编号:ym503 ☑️ 品牌:Uniapp ☑️ 语言:php ☑️ 大小:63MB ☑️ 类型:即时通讯聊天 ☑️ 支持:安卓AP ...
- java 解析 cim e 模型 架包,基于JAVA平台的CIM模型潮流数据转换方法及装置与流程...
本发明涉及电力系统公共信息模型领域,尤其涉及一种基于JAVA平台的CIM模型潮流数据转换方法及装置. 背景技术: CIM采用开关/节点模型描述电力系统网络,而在计算电网潮流时应用功能是母线/支路模型. ...
- asp毕业设计——基于vb+VB.NET+SQL Server的数据存储与交换系统设计与实现(毕业论文+程序源码)——数据存储与交换系统
基于vb+VB.NET+SQL Server的数据存储与交换系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于vb+VB.NET+SQL Server的数据存储与交换系统设计与实现,文章 ...
- 【Android数据存储】ContentProvider详细介绍(附实例源码)
1.ContentProvider是什么? ContentProvider--内容提供者.它是一个类,这个类主要是对Android系统中进行共享的数据进行包装,并提供了一组统一的访问接口供其他程序调用 ...
- Esp8266 进阶之路20 【高级篇】深入学习esp8266的esp now模式组网,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。(附带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
- javaWeb的线下服装店管理平台、基于ssm(springboot版本也有)+mysql线下服装销售系统
主要技术 SpringBoot\SSM(两个版本都有) HTML.jQuery.HTML.CSS.JS Mysql bootstrap 开发工具和环境 Eclipse\idea(都可以)兼容 Mave ...
最新文章
- 三角函数在线快速计算机,三角函数计算器
- LeetCode Algorithm 217. 存在重复元素
- 软件定义,软件开发,软件维护
- 波士顿动力再发逆天机器人视频:倒立、360°旋转、空中劈叉,真是秀儿
- hacker_Hacker Public Radio上的免费软件
- Android 替换字体的方式以及同时替换多种字体
- SAP License:SAP顾问薪酬
- 自定义无穷大∞的显示内容
- AMESim 14.0 win10环境下安装教程
- 【设计模式从青铜到王者】第八篇:创建型模式之建造者模式(BuilderPattern)
- 送书 | 《Python3爬虫实战——数据清洗、数据分析与可视化》
- 自行车、电动自行车、儿童自行车做16 CFR 1512测试报告
- red hat linux 9.0下载地址集合,Red Hat Linux 9.0 iso最新下载地址
- 【一起入门NLP】中科院自然语言处理第16课-简明扼要:红到发紫的prompt是什么?【上】
- 以下哪个函数不能选择mysql数据库_PHP使用以下哪个函数连接MySQL数据库服务器...
- 【0091】【创建postgres后端进程】PostgreSQL如何接收并处理客户端的socket请求(4)?
- java 调用matlab rank_科学网—Matlab: X is rank deficient - 李旭的博文
- mac下iterm使用rz指令卡死解决方法
- win7运行在哪_控制面板在哪,n卡控制面板打不开
- 加盟店铺管理门道多,国内十大加盟店管理软件来帮你!