SpringBoot----即时聊天(webSocket)
前后端分离项目–二手交易平台小程序
SpringBoot----物品点赞功能实现
SpringBoot----物品收藏功能实现
SpringBoot----评论回复功能实现(数据库设计)
SpringBoot----文件(图片)上传与显示(下载)
即时聊天
这个使用了websocket,在springboot下使用很简单。前端是小程序,这个就比较坑,小程序即时聊天上线需要域名并且使用wss协议,就是ws+ssl更加安全。但是要上线这还不够,你必须为企业主体开发者。个人开发者即时聊天属于社交、不在服务类目内,审核会不通过!!!
功能 :我们的小程序是个二手交易小程序,即时聊天对于一个后台服务器只是单核2g的来说有点抗不住。所以在双方都在线的时候没有存储聊天消息,只是在单方不在线时存储了离线消息。而且只能发三条离线消息。仿照了csdn的聊天。
使用:我们是点击进入聊天之后才发起websocket,这就造成了一个问题,就是用户退出到消息列表又重新点进入就会重新发送一个websocket请求。每次请求session都不一样。而且微信限制一个用户只能同时发起5个请求。一开始前端没能退出聊天页面就端开,就错误唉!!。只能后台去断使用sessioin.close()会调用onClose()方法
这个session是你要断的session。不过后来前端可以自己断了就nice了!
效果:
数据库设计:
- 对于展示消息聊天列表使用了一张表。last_context为对方发送的最后一条消息。只要有一方点击了私信进入聊天页面就会往表中插入两条记录。方便之后删除聊天,毕竟一方删除不能让另一方也看不到信息
- 对于消息详细离线内容,则使用了另外一张表。
后台代码:package com.w.wx.controller.WebSocket;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.w.wx.domain.ChatMessage; import com.w.wx.service.ChatService; import com.w.wx.utils.ALToHMUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;import javax.annotation.PostConstruct; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger;@Slf4j @ServerEndpoint("/wx/{fromOpenid}/{toOpenid}") @Component public class WebSocketServer {public static WebSocketServer webSocketServer;@Autowiredprivate ChatService chatService;@PostConstruct //此注解的方法在bean加载前执行private void init() {webSocketServer = this;//初始化时将静态化的interFaceInfoMapper进行了实例化webSocketServer.chatService = this.chatService;}//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。private static AtomicInteger onlineNum = new AtomicInteger();//concurrent包的线程安全HashMap,用来存放每个客户端对应的WebSocketServer对象。private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();//发送消息public void sendMessage(Session session, ChatMessage message) throws IOException {if(session != null){synchronized (session) {String s = JSONObject.toJSONString(message);System.out.println("52 发送数据:" + s);session.getBasicRemote().sendText(s);}}}//给指定用户发送信息public void sendInfo(String to_openid, ChatMessage message){Session session = sessionPools.get(to_openid);if(session == null){webSocketServer.chatService.addDeInfo(message);}else{try {sendMessage(session, message);}catch (Exception e){e.printStackTrace();}}}// 群发消息public void broadcast(ChatMessage message){for (Session session: sessionPools.values()) {try {sendMessage(session, message);} catch(Exception e){e.printStackTrace();continue;}}}//收到客户端信息后,根据接收人的username把消息推下去或者群发// to=-1群发消息@OnMessagepublic void onMessage(String message) throws IOException{ChatMessage msg=JSON.parseObject(message, ChatMessage.class);sessionPools.get(msg.getToOpenid());webSocketServer.chatService.addInfo(message);if (msg.getToOpenid().equals("-1")) {broadcast(msg);} else {sendInfo(msg.getToOpenid(),msg);}}//建立连接成功调用@OnOpenpublic void onOpen(Session session, @PathParam(value = "fromOpenid") String fromOpenid,@PathParam(value = "toOpenid") String toOpenid) throws IOException {ArrayList<ChatMessage> list = webSocketServer.chatService.getAllNotRead(fromOpenid,toOpenid);if (!list.isEmpty()) {Iterator<ChatMessage> it = list.iterator();while (it.hasNext()) {ChatMessage chatMessage = it.next();chatMessage.setContent(ALToHMUtil.toUnicode(chatMessage.getContent()));sendMessage(session, chatMessage);log.info("115 当前用户接收离线消息" + chatMessage.toString());}}sessionPools.put(fromOpenid, session);addOnlineCount();System.out.println("125 "+fromOpenid + "加入webSocket!当前人数为" + onlineNum);}//关闭连接时调用@OnClosepublic void onClose(@PathParam(value = "fromOpenid") String fromOpenid) throws IOException {Session session = sessionPools.get(fromOpenid);session.close();sessionPools.remove(fromOpenid);subOnlineCount();System.out.println(fromOpenid + "断开webSocket连接!当前人数为" + onlineNum);}//错误时调用@OnErrorpublic void onError(Session session, Throwable throwable){// System.out.println("发生错误");throwable.printStackTrace();}public static void addOnlineCount(){onlineNum.incrementAndGet();}public static void subOnlineCount() {onlineNum.decrementAndGet();}public static AtomicInteger getOnlineNumber() {return onlineNum;}public static ConcurrentHashMap<String, Session> getSessionPools() {return sessionPools;} }
2021/4/27 20:33
参考:csdn搜Java websocket 即时聊天 首页搜出来的都有看过。。。
2021/5/5 18:47
SpringBoot----即时聊天(webSocket)相关推荐
- 基于websocket实现一个简单的IM即时聊天
基于websocket实现一个简单的IM即时聊天 websocket闲聊 如何实现一个简单的聊天程序 实践 代码 效果 登陆 聊天 websocket闲聊 简而言之,就是一种服务器和客户端可以双向通信 ...
- Web端即时聊天项目实现(基于WebSocket)
Web端即时聊天项目实现 项目背景 其实这个项目算是我做过的花时间最长也投入心血最多的一个项目了,当时决定开始做这个的时候我几乎什么都不会,那时我个人的情况是: JavaEE方面: 会jsp+ser ...
- 基于WebSocket协议的iOS端即时聊天
好好好久没有在cnblogs上写博客,不过在这里写的最早的一篇博客的时间戳,真是时间久远啊,那时候还没毕业.不在cnblogs的期间,在github pages.简书上写过博客,github page ...
- (修改完善)SpringBoot+Mybatis-Plus使用webSocket实现一对一聊天
SpringBoot+Mybatis-Plus使用webSocket实现一对一聊天(第三次修改) 上一版代码链接:https://blog.csdn.net/w75545521/article/det ...
- javauniapp+SpringBoot即时通讯聊天软件源码
uniapp+SpringBoot即时通讯聊天软件源码,前端使用uniapp,后端使用SpringBoot. 手机端使用uniapp实现,目前仅支持安卓端和iOS端,小程序端和H5端暂未做适配. 下载 ...
- Uniapp+SpringBoot即时通讯聊天安卓APP源码
Uniapp+SpringBoot即时通讯聊天安卓APP源码 ☑️ 编号:ym503 ☑️ 品牌:Uniapp ☑️ 语言:php ☑️ 大小:63MB ☑️ 类型:即时通讯聊天 ☑️ 支持:安卓AP ...
- Springboot中使用websocket发送信息给指定用户和群发
websocket是一种长连接协议,相较于传统的http短连接,websocket不仅可以由客户端向服务器发送消息,可以主动向客户端发起信息,经常用于及时聊天,游戏和服务器向客户端推送信息. 主要优点 ...
- golang从简单的即时聊天来看架构演变
前言 俗话说的好,架构从来都不是一蹴而就的,没有什么架构一开始设计就是最终版本,其中需要经过很多步骤的变化,今天我们就从一个最简单的例子来看看,究竟架构这个东西是怎么变的. 我将从一个最简单的聊天室的 ...
- Node.js + Web Socket 打造即时聊天程序嗨聊(上)
前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...
- [前端] Node.js + Web Socket 打造即时聊天程序嗨聊
前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...
最新文章
- mysql中模糊查询的四种用法介绍
- 查找数组里相同元素的个数
- tensorflow sobel算子实现
- github绑定自己的域名
- iOS之深入解析Runtime的Method-Swizzling方法交换的妙用和底层原理
- “奔三”了,程序员,你该怎么选择未来的路?
- AltTab 把 Windows 的 Alt+Tab 功能带到 macOS
- LeetCode之翻转字符串里的单词
- linux librtmp 编译,在linux系统下安装python librtmp包的实现方法
- 神舟战神k550d i7d2笔记本u盘启动的方法
- 微信小程序添加删除线和下划线
- 什么是EDI报文标准?
- 电子邮件客户端java实现_java电子邮件客户端软件
- 深圳南山区学位申请特殊住房需要的材料有哪些
- matlab的空间坐标轴,空间三维坐标轴旋转
- linux 编码文件,linux文件编码
- 微软Office 2013定价及版本详情曝光
- 机器学习中的数据泄露(Data Leakage)
- NOIWC 2019 冬眠记 【游记】
- iOS自带地图纠偏问题