当前位置: 首页 > news >正文

WebSocket 协议

原文地址:xupengboo

WebSocket

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议

在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

传统的一些网站推送技术,使用的技术是Ajax轮询。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

image-20240912092015069

聊天室案例,index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebSocket 聊天室</title>
</head>
<body><h1>WebSocket 聊天室</h1><div><input id="messageInput" type="text" placeholder="输入消息..." /><button onclick="sendMessage()">发送</button></div><div><h2>聊天记录:</h2><pre id="chatLog"></pre></div><script>// 连接到 WebSocket 服务器const ws = new WebSocket('ws://localhost:8080/chat');// 监听 WebSocket 打开事件ws.onopen = function() {console.log('WebSocket 连接已打开');};// 监听 WebSocket 消息事件ws.onmessage = function(event) {console.log('收到服务器消息:', event.data);document.getElementById('chatLog').textContent += event.data + '\n';};// 发送消息到服务器function sendMessage() {const message = document.getElementById('messageInput').value;ws.send(message);}// 监听 WebSocket 错误事件ws.onerror = function(error) {console.error('WebSocket 错误:', error);};// 监听 WebSocket 关闭事件ws.onclose = function() {console.log('WebSocket 连接已关闭');};</script>
</body>
</html>

通过 SpringBoot 实现后台,WebSocket 通信服务:

  1. 引入 WebSocket 依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 定义一个 WebSocket Handler 继承类:
package com.itholmes.demo.websocket;import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import java.util.Collections;
import java.util.HashSet;
import java.util.Set;/*** @Author xupengboo* @Date 2024/9/12 9:25* @Describe*/
public class ChatWebSocketHandler extends TextWebSocketHandler {// 用于存储所有客户端连接private final Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<>());// 当客户端连接时触发@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {sessions.add(session);System.out.println("新连接:" + session.getId());}// 当收到客户端消息时触发@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String payload = message.getPayload();System.out.println("收到消息:" + payload);// 将消息广播给所有连接的客户端for (WebSocketSession webSocketSession : sessions) {if (webSocketSession.isOpen()) {webSocketSession.sendMessage(new TextMessage("客户端 " + session.getId() + " 说:" + payload));}}}// 当连接关闭时触发@Overridepublic void afterConnectionClosed(WebSocketSession session, org.springframework.web.socket.CloseStatus status) throws Exception {sessions.remove(session);System.out.println("连接关闭:" + session.getId());}}
  1. 配置 WebSocketConfigurer 类:
package com.itholmes.demo.websocket;import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;/*** @Author xupengboo* @Date 2024/9/12 9:26* @Describe*/
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {// 注册 WebSocket 处理器和路径registry.addHandler(new ChatWebSocketHandler(), "/chat").setAllowedOrigins("*");  // 允许跨域}}
  1. 启动服务,配合前端测试即可。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 35天学习小结
  • 三十五、Gin注册功能实战
  • 下载github patch到本地
  • F28335的存储器与寄存器
  • k8s部署springcloud-alibaba项目
  • ubuntu2204安装kvm
  • C++设计模式——Visitor访问者模式
  • MySQL索引的深入学习与应用
  • pip install “git+https://xxx“报错error: subprocess-exited-with-error
  • C++编程语言:基础设施:函数(Bjarne Stroustrup)
  • React项目中使用发布订阅模式
  • PMP--一模--解题--11-20
  • Hive是什么?
  • 缓存预热/雪崩/穿透/击穿
  • 828华为云征文 | Flexus X的力量,驱动Halo博客在云端飞驰
  • 分享一款快速APP功能测试工具
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • android图片蒙层
  • egg(89)--egg之redis的发布和订阅
  • exif信息对照
  • Git的一些常用操作
  • happypack两次报错的问题
  • HTTP中GET与POST的区别 99%的错误认识
  • js继承的实现方法
  • PHP的类修饰符与访问修饰符
  • PV统计优化设计
  • python大佬养成计划----difflib模块
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 关于使用markdown的方法(引自CSDN教程)
  • hi-nginx-1.3.4编译安装
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • # .NET Framework中使用命名管道进行进程间通信
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #QT(串口助手-界面)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (day 12)JavaScript学习笔记(数组3)
  • (Java)【深基9.例1】选举学生会
  • (Java数据结构)ArrayList
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (六)c52学习之旅-独立按键
  • (一)SvelteKit教程:hello world
  • (一)UDP基本编程步骤
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转) Android中ViewStub组件使用
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)一些感悟
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .apk文件,IIS不支持下载解决