Hi! 我是小小,今天是本周的第三篇,本篇将会着重的讲解关于WebSocket的相关知识,本篇开始讲解。

什么是WebSocket

WebSocket是一种基于TCP的网络协议,实现了客户端和服务端的全双工通信,即,后端可以推送数据到客户端,客户端可以推送数据到后端。其模型如下所示:下面开始对SpringBoot进行整合,项目结构如下所示:

使用步骤

添加依赖

  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-websocket</artifactId>  </dependency>

启用SpringBoot对WebSocket的支持

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

核心配置,WebSocketServer

WebSocket采用的是ws协议,所以WebSocket Server相当于一个Controller

1. @ServerEndpoint是一个类层次注解,主要是用于定义为WebSocket服务器端,用于获取URL地址,通过地址可以访问WebSocket

2. webSocketMap用于接收当前的userID,方便进行WebSocket的管理。其代码如下所示:

package cc.mrbird.febs.external.webScoket;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet;@Component
@Slf4j
@Service
@ServerEndpoint("/api/websocket/{sid}")
public class WebSocketServer {//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。private static int onlineCount = 0;//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();//与某个客户端的连接会话,需要通过它来给客户端发送数据private Session session;//接收sidprivate String sid = "";/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("sid") String sid) {this.session = session;webSocketSet.add(this);     //加入set中this.sid = sid;addOnlineCount();           //在线数加1try {sendMessage("conn_success");log.info("有新窗口开始监听:" + sid + ",当前在线人数为:" + getOnlineCount());} catch (IOException e) {log.error("websocket IO Exception");}}/*** 连接关闭调用的方法*/@OnClosepublic void onClose() {webSocketSet.remove(this);  //从set中删除subOnlineCount();           //在线数减1//断开连接情况下,更新主板占用情况为释放log.info("释放的sid为:"+sid);//这里写你 释放的时候,要处理的业务log.info("有一连接关闭!当前在线人数为" + getOnlineCount());}/*** 收到客户端消息后调用的方法* @ Param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, Session session) {log.info("收到来自窗口" + sid + "的信息:" + message);//群发消息for (WebSocketServer item : webSocketSet) {try {item.sendMessage(message);} catch (IOException e) {e.printStackTrace();}}}/*** @ Param session* @ Param error*/@OnErrorpublic void onError(Session session, Throwable error) {log.error("发生错误");error.printStackTrace();}/*** 实现服务器主动推送*/public void sendMessage(String message) throws IOException {this.session.getBasicRemote().sendText(message);}/*** 群发自定义消息*/public static void sendInfo(String message, @PathParam("sid") String sid) throws IOException {log.info("推送消息到窗口" + sid + ",推送内容:" + message);for (WebSocketServer item : webSocketSet) {try {//这里可以设定只推送给这个sid的,为null则全部推送if (sid == null) {
//                    item.sendMessage(message);} else if (item.sid.equals(sid)) {item.sendMessage(message);}} catch (IOException e) {continue;}}}public static synchronized int getOnlineCount() {return onlineCount;}public static synchronized void addOnlineCount() {WebSocketServer.onlineCount++;}public static synchronized void subOnlineCount() {WebSocketServer.onlineCount--;}public static CopyOnWriteArraySet<WebSocketServer> getWebSocketSet() {return webSocketSet;}
}

测试Controller


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@Controller("web_Scoket_system")
@RequestMapping("/api/socket")
public class SystemController {//页面请求@GetMapping("/index/{userId}")public ModelAndView socket(@PathVariable String userId) {ModelAndView mav = new ModelAndView("/socket1");mav.addObject("userId", userId);return mav;}//推送数据接口@ResponseBody@RequestMapping("/socket/push/{cid}")public Map pushToWeb(@PathVariable String cid, String message) {Map<String,Object> result = new HashMap<>();try {WebSocketServer.sendInfo(message, cid);result.put("code", cid);result.put("msg", message);} catch (IOException e) {e.printStackTrace();}return result;}
}

测试页面Index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Java后端WebSocket的Tomcat实现</title><script type="text/javascript" src="js/jquery.min.js"></script></head><body><div id="main" style="width: 1200px;height:800px;"></div>Welcome<br/><input id="text" type="text" /><button onclick="send()">发送消息</button><hr/><button onclick="closeWebSocket()">关闭WebSocket连接</button><hr/><div id="message"></div></body><script type="text/javascript">var websocket = null;//判断当前浏览器是否支持WebSocketif('WebSocket' in window) {//改成你的地址websocket = new WebSocket("ws://192.168.100.196:8082/api/websocket/100");} else {alert('当前浏览器 Not support websocket')}//连接发生错误的回调方法websocket.onerror = function() {setMessageInnerHTML("WebSocket连接发生错误");};//连接成功建立的回调方法websocket.onopen = function() {setMessageInnerHTML("WebSocket连接成功");}var U01data, Uidata, Usdata//接收到消息的回调方法websocket.onmessage = function(event) {console.log(event);setMessageInnerHTML(event);setechart()}//连接关闭的回调方法websocket.onclose = function() {setMessageInnerHTML("WebSocket连接关闭");}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。window.onbeforeunload = function() {closeWebSocket();}//将消息显示在网页上function setMessageInnerHTML(innerHTML) {document.getElementById('message').innerHTML += innerHTML + '<br/>';}//关闭WebSocket连接function closeWebSocket() {websocket.close();}//发送消息function send() {var message = document.getElementById('text').value;websocket.send('{"msg":"' + message + '"}');setMessageInnerHTML(message + "
");}</script></html>

结果

后端的连接信息前端需要进行连接

关于作者

我是小小,双鱼座的程序猿,我们下期再见~bye

END

「 往期文章 」

Lombook | 你的代码真正元凶找到了:Lombook

工具 | 终于等到你!地表最强工具来袭!

项目分享 | 好牛X的开源项目,看完忍不住分享(高手作品分享)

扫描二维码

获取更多精彩

小明菜市场

来源:网络(侵删)

图片来源:网络(侵删)

点个在看你最好看

WebSocket | 为什么你前后端推送不会用?因为你少了WebSocket的帮忙相关推荐

  1. websocket心跳检测前后端架构

    websocket心跳检测前后端架构 本篇文章为初略架构websocket在前后端的心跳检测机制,实现相对毛糙. 下面介绍内容参照 廖雪峰 的描述,为了切换页面麻烦,这里就直接挑简要的信息复制黏贴过来 ...

  2. netty服务器定时发送消息,netty+websocket+quartz实现消息定时推送

    netty+websocket+quartz实现消息定时推送&&IM聊天室 在讲功能实现之前,我们先来捋一下底层的原理,后面附上工程结构及代码 1.NIO NIO主要包含三大核心部分: ...

  3. Spring之WebSocket网页聊天以及服务器推送

    Spring之WebSocket网页聊天以及服务器推送 转自:http://www.xdemo.org/spring-websocket-comet/ /Springframework /Spring ...

  4. 基于websocket的网页实时消息推送与在线聊天(上篇)

    文章目录 @[toc] 基于websocket的网页实时消息推送与在线聊天(上篇) "使用dwebsocket在django中实现websocket" websocket原理图 d ...

  5. 长连接/websocket/SSE等主流服务器推送技术比较

    最近做的某个项目有个需求,需要实时提醒client端有线上订单消息.所以保持客户端和服务器端的信息同步是关键要素,对此我们了解了可实现的方式.本文将介绍web常用的几种方式,希望给需要服务器端推送消息 ...

  6. 若依+websocket+springboot+elementui 实现消息推送

    场景 服务端有定时任务,会监测预警的一些事件,当定时任务监测到预警产生的时候,需要向WEB端推送预警的内容,实现效果如下图所示: 实现思路 我使用的框架后端是若依架构,定时任务加websocket通讯 ...

  7. websocket心跳链接代码_Hyperf+RabbitMQ+WebSocket实现大屏幕消息推送

    作者:八重樱 来源:www.cnblogs.com/a609251438/p/12713467.html 介绍 基于 Hyperf+ WebSocket +RabbitMQ 实现的一个简单大屏幕的消息 ...

  8. Android中脱离WebView使用WebSocket实现群聊和推送功能

    WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能.更多知识参考 ...

  9. websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...

    问题背景 为什么要要用websocket呢?websocket相对于传统http协议有什么优势呢? http协议有一个缺陷,就是通信只能由客户端发起,服务器返回数据,不能做到服务器主动向客户端推送.这 ...

最新文章

  1. fedora上ARM-LINUX-GCC 编译器安装
  2. git cherry-pick简介
  3. 如何通过c语言获取ipv6邻居表,急求在vc++6.0中获取IPV6地址的方法,高手请进,谢谢!!...
  4. win7光盘修复计算机在哪,win7如何创建系统还原及系统修复光盘功能应用
  5. 九十年代以来的文学事变与60后70后80后作家的写作之一
  6. lightoj1060_组合数学
  7. 数据可视化 信息可视化_更好的数据可视化的8个技巧
  8. 第六章 设计程序架构 之 设计实现WebSocket策略
  9. 可能是最全的一份 2017 年中国移动互联网年度报告(建议收藏)
  10. Android滑动页面返回(自定义控件)
  11. 数据库实时同步技术解决方案
  12. STM32利用Flymcu进行烧录
  13. 值得收藏——在线小视频解析下载教程合集
  14. [笔记]三维激光SLAM学习——LiDAR里程计原理推导代码实现
  15. 小米平板4刷 linux,小米平板4_刷开发版_获取root
  16. 【Windows】键盘禁用(屏蔽)Win快捷键
  17. TrueCrypt介绍及入门使用讲解【翻译】
  18. Excel序号类操作实例
  19. java计算机毕业设计Internet快递柜管理系统(附源码、数据库)
  20. Win11图片打开为Windows照片查看器

热门文章

  1. 2016-6-16 拓展练习
  2. iOS推送群发的问题,PushSharp作者的这篇讲得最详细了
  3. 如何在Linux上使用netstat命令查证DDOS***
  4. ASP.NET Web API 简介
  5. ASP.NET MVC3 系列教程 – Web Pages 1.0
  6. Back to back销售订单和drop ship第三方销售订单的销售成本的问题
  7. [脚本收集]提取Tripntale图片
  8. 解决 Python fake_useragent 报错 fake-useragent Maximum amount of retries reached问题
  9. 图解centos安装详细过程
  10. Linux串口打印信息工具,基于Qt实现Linux或Windows串口打印工具