一.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实现消息推送和在线用户统计相关推荐

  1. springboot集成webSocket实现实时推送

    springboot集成webSocket实现实时推送 webSocket实现推送 webSocket是什么? 需求说明 websocket集成步骤 pom.xml webSocket实现 自定义处理 ...

  2. springboot整合websocket进行消息推送

    什么是websocket? WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据. ...

  3. springboot整合websocket实现消息推送

    springboot整合websocket 1.WebSocket介绍与原理 介绍:WebSocket是HTML5一种新的协议.它实现了浏览器与服务器全双工通信.一开始的握手需要借助HTTP请求完成. ...

  4. springboot定时发送短信_springboot 整合websocket实现消息推送(主动推送,具体用户推送,群发,定时推送)...

    websocket springboot 整合websocket实现消息推送(主动推送,具体用户推送,群发,定时推送) 使用WebSocket构建交互式Web应用程序 本指南将引导您完成创建" ...

  5. Vue-全局websocket 实现消息推送

    在上一篇文章 WebSocket 消息推送https://blog.csdn.net/qq_63312957/article/details/125375122?spm=1001.2014.3001. ...

  6. spring boot 集成socketIo 做消息推送

    spring boot 集成socketIo 做消息推送 项目需求 代码展示 客户端代码 服务端代码 项目需求 后台管理系统用户小铃铛,消息推送功能并展示有多少条消息或者小红点 代码展示 客户端代码 ...

  7. php通知websocket,php实现websocket实时消息推送

    php实现websocket实时消息推送,供大家参考,具体内容如下 SocketService.php /** * Created by xwx * Date: 2017/10/18 * Time: ...

  8. python websocket实现消息推送_python Django websocket 实时消息推送

    [实例简介] Django websocket 实时消息推送 服务端主动推送 调用 send(username, title, data, url) username:用户名 title:消息标题 d ...

  9. springboot实现微信模板消息推送

    springboot实现微信模板消息推送 在上一篇文章我们已经知道了怎么获取openid 还不知道的可以查看我的上一篇文章springboot+微信小程序用codeid换取openid 这次我们不光要 ...

最新文章

  1. c语言递归求五阶行列式源代码,久游堂怎么样 -官网
  2. URI,URL和URN有什么区别?
  3. STM32 HAL库详解 及 手动移植
  4. SQL Server :DBLINK创建及使用
  5. linux内核链表使用例,Linux设备驱动工程师之路——内核链表的使用
  6. Spring Boot中静态文件获得Thymeleaf支持(配置porm.xml)
  7. Linux安装Java
  8. UVA 10115 Automatic Editing
  9. cas云计算机管理平台添加加密锁,CAS云计算管理平台安装手册.docx
  10. 中文的在一个字符串中查找另一个字符
  11. linux内核源码多大,需要多久才能看完linux内核源码?
  12. 笔记本电脑配置知识大全
  13. Ladon for Kali 2019
  14. 使用VMWARE(VMware8)安装Mac OSX 雪豹操作系统
  15. 量化投资策略——海龟策略
  16. 初中文化能学python吗_初中文化可以学Python编程吗,我想通过这个渠道进入人工智能这个大行业?...
  17. Ollydbg之字符串、WindowsAPI搜索
  18. 【微信小程序】实现简单轮播图效果
  19. Cocos2d-x 3.X, IOS版添加广点通插屏广告
  20. C#sealed关键字

热门文章

  1. 《功夫熊猫》经典台词 从来没有什么意外
  2. html+css 自己写的html5代码不规范?这一篇就够了
  3. [量化-022]估值之三 理想状态下的非周期和弱周期上市公司的纯粹估值
  4. 免费换电池还倒塞用户200,iPhone惨遭“耐用”反噬
  5. layui不能关闭弹出层
  6. sqlserver 死锁,事务(进程 ID 115)与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行该事务。
  7. JavaScript箭头函数中的this
  8. 想做全栈工程师?你要学习的还有很多。
  9. 一致性哈希算法原理,应用及代码实现
  10. 多旋翼无人机APM(PIX)飞控ardupilot missionplanner扩展调参、基本调参(PID调参)