Springboot集成websocket实现消息推送和在线用户统计
一.HTTP
说到websocket首先要说Http,Http大家都知道是一个网络通信协议,每当客户端浏览器需要访问后台时都会发一个请求,服务器给出响应后该连接就会关闭,请求只能有客户端发起,服务端是没办法主动发起请求的,对于消息推送的需求Http也可以满足要求,就是前端采用定时任务的方式去请求接口,这种轮询的方式是非常损耗服务器性能的,要尽量避免。基于此产生了全双工的网络协议-websocket。
二.WebSocket
所谓全双工指的是通信可以由任意一方发起,可以在两个方向上传输信息,采用websocket可以很好的实现消息推送的功能,从而避免了轮询的方式导致资源浪费的问题。
三.实现方式
这里采用springboot集成websocket,在springboot中使用websocket非常的方便。
首先导入websocket依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
在启动类上添加一个bean
@SpringBootApplication
public class CommonCodeApplication {@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}public static void main(String[] args) {SpringApplication.run(CommonCodeApplication.class, args);}
}
核心代码
@Component
@ServerEndpoint("/websocket2/{username}")
@Slf4j
public class WebSocketDemo2 {private static Map<String, WebSocketDemo2> webSocketMap = new HashMap<>();private static Integer onlineUserCount = 0;private Session session;private String username;/*** 建立连接* @param username* @param session*/@OnOpenpublic void onOpen(@PathParam("username") String username, Session session){this.username = username;this.session = session;webSocketMap.put(username, this);int count = addOnlineUser();log.info("当前在线用户:" + count);}/*** 关闭连接* @param username*/@OnClosepublic void onClose(@PathParam("username") String username){webSocketMap.remove(username);int count = reduceOnlineUser();log.info("当前在线用户:" + count);}@OnMessagepublic void onMessage(String message) throws IOException {JSONObject jsonObject = JSONUtil.parseObj(message);String target = jsonObject.getStr("target");String msg = jsonObject.getStr("msg");if (target.equals("all")){sendMessageAll(msg);}}/*** 给特定的人发消息,用于业务中调用* @param usernames* @param message* @throws IOException*/public void sendMessageSpecial(List<String> usernames, String message) throws IOException {for (String username : webSocketMap.keySet()) {for (String target : usernames) {if (username.equals(target)){webSocketMap.get(username).session.getBasicRemote().sendText(message);}}}}/*** 给所有人发消息* @param message* @throws IOException*/public void sendMessageAll(String message) throws IOException {for (WebSocketDemo2 item : webSocketMap.values()) {System.out.println("消息发送");item.session.getBasicRemote().sendText(message);}}public void sendMessage(String message) throws IOException {session.getBasicRemote().sendText(message);}/*** 用户离线* @return*/public int reduceOnlineUser(){return -- onlineUserCount;}/*** 累加在线用户* @return*/public int addOnlineUser(){return ++ onlineUserCount;}}
实现消息推送只要在业务代码中调用sendMessageSpecial()方法即可。
@RestController
@RequestMapping("/websocket")
public class WebSocketController {@Autowiredprivate WebSocketDemo2 webSocketDemo2;@GetMapping("/t1")public String test1() throws IOException {System.out.println("这是业务代码...");String message = "消息被督办了!";List<String> usernames = new ArrayList<>();usernames.add("张三");usernames.add("李四");usernames.add("王五");webSocketDemo2.sendMessageSpecial(usernames, message);return "ok";}}
四.测试
这里不用写前端去测试,大家可以使用这个网站进行测试
websocket测试
这里开了三个窗口进行测试,三个人的姓名分别是:张三、李四、王五
然后调用刚才的业务接口测试:http://localhost:8080/websocket/t1
调用成功后可以看到三个窗口中都收到了消息
Springboot集成websocket实现消息推送和在线用户统计相关推荐
- springboot集成webSocket实现实时推送
springboot集成webSocket实现实时推送 webSocket实现推送 webSocket是什么? 需求说明 websocket集成步骤 pom.xml webSocket实现 自定义处理 ...
- springboot整合websocket进行消息推送
什么是websocket? WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据. ...
- springboot整合websocket实现消息推送
springboot整合websocket 1.WebSocket介绍与原理 介绍:WebSocket是HTML5一种新的协议.它实现了浏览器与服务器全双工通信.一开始的握手需要借助HTTP请求完成. ...
- springboot定时发送短信_springboot 整合websocket实现消息推送(主动推送,具体用户推送,群发,定时推送)...
websocket springboot 整合websocket实现消息推送(主动推送,具体用户推送,群发,定时推送) 使用WebSocket构建交互式Web应用程序 本指南将引导您完成创建" ...
- Vue-全局websocket 实现消息推送
在上一篇文章 WebSocket 消息推送https://blog.csdn.net/qq_63312957/article/details/125375122?spm=1001.2014.3001. ...
- spring boot 集成socketIo 做消息推送
spring boot 集成socketIo 做消息推送 项目需求 代码展示 客户端代码 服务端代码 项目需求 后台管理系统用户小铃铛,消息推送功能并展示有多少条消息或者小红点 代码展示 客户端代码 ...
- php通知websocket,php实现websocket实时消息推送
php实现websocket实时消息推送,供大家参考,具体内容如下 SocketService.php /** * Created by xwx * Date: 2017/10/18 * Time: ...
- python websocket实现消息推送_python Django websocket 实时消息推送
[实例简介] Django websocket 实时消息推送 服务端主动推送 调用 send(username, title, data, url) username:用户名 title:消息标题 d ...
- springboot实现微信模板消息推送
springboot实现微信模板消息推送 在上一篇文章我们已经知道了怎么获取openid 还不知道的可以查看我的上一篇文章springboot+微信小程序用codeid换取openid 这次我们不光要 ...
最新文章
- c语言递归求五阶行列式源代码,久游堂怎么样 -官网
- URI,URL和URN有什么区别?
- STM32 HAL库详解 及 手动移植
- SQL Server :DBLINK创建及使用
- linux内核链表使用例,Linux设备驱动工程师之路——内核链表的使用
- Spring Boot中静态文件获得Thymeleaf支持(配置porm.xml)
- Linux安装Java
- UVA 10115 Automatic Editing
- cas云计算机管理平台添加加密锁,CAS云计算管理平台安装手册.docx
- 中文的在一个字符串中查找另一个字符
- linux内核源码多大,需要多久才能看完linux内核源码?
- 笔记本电脑配置知识大全
- Ladon for Kali 2019
- 使用VMWARE(VMware8)安装Mac OSX 雪豹操作系统
- 量化投资策略——海龟策略
- 初中文化能学python吗_初中文化可以学Python编程吗,我想通过这个渠道进入人工智能这个大行业?...
- Ollydbg之字符串、WindowsAPI搜索
- 【微信小程序】实现简单轮播图效果
- Cocos2d-x 3.X, IOS版添加广点通插屏广告
- C#sealed关键字
热门文章
- 《功夫熊猫》经典台词 从来没有什么意外
- html+css 自己写的html5代码不规范?这一篇就够了
- [量化-022]估值之三 理想状态下的非周期和弱周期上市公司的纯粹估值
- 免费换电池还倒塞用户200,iPhone惨遭“耐用”反噬
- layui不能关闭弹出层
- sqlserver 死锁,事务(进程 ID 115)与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行该事务。
- JavaScript箭头函数中的this
- 想做全栈工程师?你要学习的还有很多。
- 一致性哈希算法原理,应用及代码实现
- 多旋翼无人机APM(PIX)飞控ardupilot missionplanner扩展调参、基本调参(PID调参)