websocket是h5后的技术,主要实现是一个长连接跟tomcat的comet技术差不多,但websocket是基于web协议的,有更广泛的支持。当然,在处理高并发的情况下,可以结合tomcat的asyncContext来实现长处理的异步返回等操作。

1.引入依赖类

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <version>1.16.</version>
  5. </dependency>
  6.  
  7. <!-- websocket dependency -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-websocket</artifactId>
  11. </dependency>

这里主要是引入websocket的依赖类

2.springboot配置websocket的入口bean

在springboot的配置类下,引入以下的配置bean

  1. @Bean
  2. public ServerEndpointExporter serverEndpointExporter() {
  3. return new ServerEndpointExporter();
  4. }

3.实现websocket的后端处理逻辑

  1. package com.ouyang.server;
  2.  
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.stereotype.Component;
  7.  
  8. import javax.websocket.*;
  9. import javax.websocket.server.ServerEndpoint;
  10. import java.io.IOException;
  11. import java.util.concurrent.ConcurrentHashMap;
  12. import java.util.concurrent.CopyOnWriteArraySet;
  13.  
  14. /**
  15. * Created by Administrator on 2018/3/25.
  16. */
  17.  
  18. //@Slf4j
  19. @ServerEndpoint(value = "/websocket")
  20. @Component
  21. public class WebSocketServer {
  22.  
  23. Logger log = LoggerFactory.getLogger(WebSocketServer.class);
  24. //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
  25. private static int onlineCount = ;
  26. //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
  27. private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
  28. // 备用的同步hashmap
  29. //private static ConcurrentHashMap<Session,WebSocketServer> webSocketServerConcurrentHashMap = new ConcurrentHashMap();
  30.  
  31. //与某个客户端的连接会话,需要通过它来给客户端发送数据
  32. private Session session;
  33.  
  34. /**
  35. * 连接建立成功调用的方法*/
  36. @OnOpen
  37. public void onOpen(Session session) {
  38. this.session = session;
  39. webSocketSet.add(this); //加入set中
  40. addOnlineCount(); //在线数加1
  41. log.info("有新连接加入!当前在线人数为" + getOnlineCount());
  42. try {
  43. sendMessage("连接成功");
  44. } catch (IOException e) {
  45. log.error("websocket IO异常");
  46. }
  47. }
  48. // //连接打开时执行
  49. // @OnOpen
  50. // public void onOpen(@PathParam("user") String user, Session session) {
  51. // currentUser = user;
  52. // System.out.println("Connected ... " + session.getId());
  53. // }
  54.  
  55. /**
  56. * 连接关闭调用的方法
  57. */
  58. @OnClose
  59. public void onClose() {
  60. webSocketSet.remove(this); //从set中删除
  61. subOnlineCount(); //在线数减1
  62. log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
  63. }
  64.  
  65. /**
  66. * 收到客户端消息后调用的方法
  67. *
  68. * @param message 客户端发送过来的消息*/
  69. @OnMessage
  70. public void onMessage(String message, Session session) throws IOException {
  71. log.info("来自客户端的消息:" + message);
  72.  
  73. //群发消息
  74. for (WebSocketServer item : webSocketSet) {
  75. try {
  76. item.sendMessage("response message:"+message);
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. }
  80. }
  81. //单发的信息
  82. sendMessage("currentWebsocket is ok!!! ");
  83. }
  84.  
  85. /**
  86. *
  87. * @param session
  88. * @param error
  89. */
  90. @OnError
  91. public void onError(Session session, Throwable error) {
  92. log.error("发生错误");
  93. error.printStackTrace();
  94. }
  95.  
  96. /**
  97. *
  98. * @param message
  99. * @throws IOException
  100. */
  101. public void sendMessage(String message) throws IOException {
  102. this.session.getBasicRemote().sendText(message);
  103. }
  104.  
  105. /**
  106. * 群发自定义消息
  107. * */
  108. public static void sendInfo(String message) throws IOException {
  109. //log.info(message);
  110. for (WebSocketServer item : webSocketSet) {
  111. try {
  112. item.sendMessage(message);
  113. } catch (IOException e) {
  114. continue;
  115. }
  116. }
  117. }
  118.  
  119. public static synchronized int getOnlineCount() {
  120. return onlineCount;
  121. }
  122.  
  123. public static synchronized void addOnlineCount() {
  124. WebSocketServer.onlineCount++;
  125. }
  126.  
  127. public static synchronized void subOnlineCount() {
  128. WebSocketServer.onlineCount--;
  129. }
  130. }

至此,我们关于后台的websocket的主要实现类都实现了,接下来我们可以弄一个,测试的接口,用于给所有的websocket推送信息,如下:

  1. @RequestMapping(value="/publicSend",method= RequestMethod.GET)
  2. @ResponseBody
  3. public String pushVideoListToWeb2(String id) {
  4. try {
  5. WebSocketServer.sendInfo("有新客户呼入,sltAccountId:"+id);
  6. for(int i= ;i<;i++){
  7. WebSocketServer.sendInfo("有新客户呼入,testing:"+String.valueOf(i));
  8. }
  9. }catch (IOException e) {
  10.  
  11. }
  12. return "success!";
  13.  
  14. }

4.前端测试页面的实现

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.springframework.org/schema/jdbc">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="/static/jquery.js"></script>
  7. <script src="/static/stomp.min.js"></script>
  8. <script src="/static/sockjs.min.js"></script>
  9. <script>
  10. //socket = new WebSocket("ws://localhost:8081/begenstom/websocket");
  11. var socket;
  12. if(typeof(WebSocket) == "undefined") {
  13. console.log("您的浏览器不支持WebSocket");
  14. }else {
  15. console.log("您的浏览器支持WebSocket");
  16.  
  17. //实现化WebSocket对象,指定要连接的服务器地址与端口
  18. //socket = new WebSocket("ws://localhost:9094/starManager/websocket/张三");
  19. socket = new WebSocket("ws://localhost:8081/websocket");
  20. //打开事件
  21. socket.onopen = function () {
  22. console.log("Socket 已打开");
  23. for (var i=;i<;i++)
  24. {
  25. socket.send("这是来自客户端的消息1:" + i);
  26. }
  27. //socket.send("这是来自客户端的消息" + location.href + new Date());
  28. };
  29. //获得消息事件
  30. socket.onmessage = function (msg) {
  31. console.log(msg.data);
  32. //发现消息进入 调后台获取
  33. document.write(msg.data);
  34. };
  35. //关闭事件
  36. socket.onclose = function () {
  37. console.log("Socket已关闭");
  38. };
  39. //发生了错误事件
  40. socket.onerror = function () {
  41. alert("Socket发生了错误");
  42. }
  43. $(window).unload(function () {
  44. socket.close();
  45. });
  46. }
  47. </script>
  48.  
  49. </head>
  50. <body>
  51.  
  52. </body>
  53. </html>

这里主要用到3个js,可以去github上去当一个。

测试结果:==================


参考地址:
* https://blog.csdn.net/zhangdehua678/article/details/78913839
* https://github.com/ayman-elgharabawy/Kafka-SpringBoot-WebSocket
* 整合框架 https://github.com/527515025/springBoot

springboot+websocket 归纳收集的更多相关文章

  1. SpringBoot+WebSocket

    SpringBoot+WebSocket 只需三个步骤 导入依赖 <dependency> <groupId>org.springframework.boot</grou ...

  2. springboot+websocket+sockjs进行消息推送【基于STOMP协议】

    springboot+websocket+sockjs进行消息推送[基于STOMP协议] WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就 ...

  3. SpringBoot WebSocket STOMP 广播配置

    目录 1. 前言 2. STOMP协议 3. SpringBoot WebSocket集成 3.1 导入websocket包 3.2 配置WebSocket 3.3 对外暴露接口 4. 前端对接测试 ...

  4. Java Springboot webSocket简单实现,调接口推送消息到客户端socket

    Java Springboot webSocket简单实现,调接口推送消息到客户端socket 后台一般作为webSocket服务器,前台作为client.真实场景可能是后台程序在运行时(满足一定条件 ...

  5. Springboot+Websocket+JWT实现的即时通讯模块

    场景 目前做了一个接口:邀请用户成为某课程的管理员,于是我感觉有能在用户被邀请之后能有个立马通知他本人的机(类似微博.朋友圈被点赞后就有立马能收到通知一样),于是就闲来没事搞了一套. ​ 涉及技术栈 ...

  6. Springboot+websocket+定时器实现消息推送

    由于最近有个需求,产品即将到期(不同时间段到期)时给后台用户按角色推送,功能完成之后在此做个小结 1. 在启动类中添加注解@EnableScheduling package com.hsfw.back ...

  7. springboot websocket 一篇足够了

    什么是WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 … 为什么要实现握手监控管理 如果说,连接随意创建,不管的话,会存在错误,broken pipe 表面看单纯报 ...

  8. SpringBoot + WebSocket 开发笔记

    1. 服务端的实现,我尝试了两种方式: 第一种是用“@ServerEndPoint”注解来实现,实现简单: 第二种稍显麻烦,但是可以添加拦截器在WebSocket连接建立和断开前进行一些额外操作. 不 ...

  9. springBoot -webSocket 基于STOMP协议交互

    浅谈WebSocket WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就可以建立一条快速通道,两者就可以实现数据互传了.说白了,就是打破了 ...

随机推荐

  1. JavaScript大杂烩9 - 理解BOM

    毫无疑问,我们学习JavaScript是为了完成特定的功能.在最初的JavaScript类型系统中,我们已经分析过JavaScript在页面开发中充当着添加逻辑的角色,而且我们知道JavaScript ...

  2. JMeter—配置元件(七)

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第二节配置元件JMeter配置元件可以用来初始化默认值和变量,以便后续采样器使用.将在其作用域的初始化阶段处理. ...

  3. jquery常用表单操作

    //js将表单序列化成对象 $.fn.serializeObject = function () { var $els = $(this).find("[name]"); var ...

  4. 分布式文件系统(HDFS)与 linux系统文件系统 对比

    初次接触分布式文件系统,有很多迷惑.通过参考网络文章,这里进行对比一下Hadoop 分布式文件系统(HDFS)与 传统文件系统之间的关系:   Linux 文件系统 分布式文件系统 块 块对应物理磁盘 ...

  5. Emacs中使用shell(调出terminal)

    在Emacs中使用shell(调出terminal) 方法: M-x eshell 注意:不能使用 M-x shell,这样调用的是 cmd命令,一些命令无法使用

  6. 4.92Python数据类型之(7)字典

    目录 目录 前言 (一)字典的基本知识 ==1.字典的基本格式== (二)字典的操作 ==1.字典元素的增加== ==2.字典值的查找== ==3.字典的修改== ==4.字典的删除== ==5.字典 ...

  7. Django复习之ORM

    QuerySet数据类型:                        1.可切片,可迭代      [obj,....]                    2.惰性查询:            ...

  8. 合并多个Excel文件

    这条分享来自百度经验https://jingyan.baidu.com/article/e6c8503cb6ed7ee54e1a1811.html

  9. 【洛谷】【数论】P1876 开灯

    [题目描述:] 首先所有的灯都是关的(注意是关!),编号为1的人走过来,把是一的倍数的灯全部打开,编号为二的的把是二的倍数的灯全部关上,编号为3的人又把是三的倍数的灯开的关上,关的开起来--直到第N个 ...

  10. Redis和Memcached的一些区别

    我们都知道,把一些热数据存到缓存中可以极大的提高速度,那么问题来了,是用Redis好还是Memcached好呢,以下是它们两者之间一些简单的区别与比较: 1. Redis不仅支持简单的k/v类型的数据 ...