WebSocket --学习笔记

一、概述

WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。

想象一下平时我们使用的聊天软件,当你发送一条信息后,通常不需要刷新页面,对方就能准时收到消息;同样地,当对方回复时,你也能立即看到新消息。这种实时且双向的数据交换就是WebSocket实现的效果。

与传统的HTTP请求不同,HTTP请求通常是单向的,客户端发送一个请求到服务器,服务器返回一个响应,结束这次通信;如果客户端需要新的数据,它必须再次发起请求。这个过程通常不能立即被客户端触发,这就导致了数据的实时更新较为复杂。

简单的说,Http就像是俩个人互相写信,而WebSocket就是俩个人互相打电话

WebSocket缺点:

服务器长期维护长连接需要一定的成本 各个浏览器支持程度不一 WebSocket 是长连接,受网络限制比较大,需要处理好重连

结论:WebSocket并不能完全取代HTTP,它只适合在特定的场景下使用

二、使用

1、添加依赖

WebSocket依赖:

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

2、配置WebSocket消息处理器

创建一个WebSocket的消息处理器来处理客户端发来的消息:

/*** WebSocket服务*/
@Component
@ServerEndpoint("/***")    //请求路径
public class WebSocketServer {//存放会话对象private static final Map<String, Session> sessionMap = new HashMap();/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("sid") String sid) {System.out.println("客户端:" + sid + "建立连接");sessionMap.put(sid, session);}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, @PathParam("sid") String sid) {System.out.println("收到来自客户端:" + sid + "的信息:" + message);}/*** 连接关闭调用的方法** @param sid*/@OnClosepublic void onClose(@PathParam("sid") String sid) {System.out.println("连接断开:" + sid);sessionMap.remove(sid);}/*** 群发** @param message*/public void sendToAllClient(String message) {Collection<Session> sessions = sessionMap.values();for (Session session : sessions) {try {//服务器向客户端发送消息session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}

2、添加配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** WebSocket配置类,用于注册WebSocket的Bean*/
@Configuration
public class WebSocketConfiguration {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

4、与客户端建立连接

客户端需要使用WebSocket API或者兼容的库来连接至服务器的WebSocket端点。以下是一个简单的JavaScript例子,展示如何建立连接并发送/接收消息:

   <!DOCTYPE html><html><body><script type="text/javascript">var ws = new WebSocket("ws://localhost:8080/my-websocket");ws.onopen = function() {console.log("连接开启");ws.send("Hello Server!");};ws.onmessage = function(event) {console.log("接收到消息: " + event.data);};ws.onclose = function() {console.log("连接关闭");};ws.onerror = function() {console.log("发生错误");};</script></body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL:vector

文章目录 标准库中的vectorvector的构造vector的迭代器vector的容量vector的元素访问data vector的修改 vector和string的迭代器失效问题resize、reserve、insert、push_back、assigneraseg 和 vs 的区别string解决迭代器失效的方法 标准库中的vector vector是表示可变大小数组…

elasticsearch运维_分享两个自己整理的比较好用的elasticsearch脚本

今天分享两个自己编写整理的比较好用的脚本,我平时也经常在elasticsearch生产环境使用。 后面将会不定期给大家分享自己在生产运维中整理的好的脚本和命令给大家分享。 #!/bin/bash# 定义 Elasticsearch 地址、端口、用户名和密码 ES_HOST="192.168.xxx.xxx" ES_P…

深度学习设计模式之装饰器模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 装饰器模式属于结构型模式&#xff0c;又叫包装设计模式&#xff0c;动态的将责任添加到对象上。 一、介绍 装饰器模式又叫包装设计模式&#xff0c;为现有的类的一个…

STL中list的模拟实现

目录 list模拟实现 list节点 list的push_back()函数 list的迭代器操作&#xff08;非const&#xff09; list的迭代器操作&#xff08;const&#xff09; list迭代器const 非const优化 list的insert()函数 list的erase()函数 list的pop_back() push_front() pop_front(…

M3/M4 Ultra Mac Pro:你需要知道的一切

本文翻译自&#xff1a;M3/M4 Ultra Mac Pro: Everything you need to know (By Roman Loyola2024年5月15日 ) https://www.macworld.com/article/2320613/m3-m4-ultra-mac-pro-everything-you-need-to-know.html 文章目录 Mac Pro M3/M4&#xff1a;发布日期Mac Pro M3/M4&…

代码随想录|Day34|贪心算法 part03|● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

1005.K次取反后最大化的数组和 class Solution: def largestSumAfterKNegations(self, nums: List[int], k: int) -> int: nums.sort() for i in range(len(nums)): if nums[i] < 0 and k > 0: nums[i] -nums[i] k - 1 if k % 2 1: nums.sort() nums[0] *…

C语言网页编程:深度探索与实践挑战

C语言网页编程&#xff1a;深度探索与实践挑战 在编程的广阔领域中&#xff0c;C语言以其高效、稳定和接近底层的特性著称。然而&#xff0c;当提及C语言与网页编程的结合时&#xff0c;许多人可能会感到困惑。毕竟&#xff0c;C语言通常被视为系统级编程的利器&#xff0c;而…

Expression #1 of SELECT list is not in GROUP BY clause and

mybatis-plus mysql8.0 group 1055 - Expression #1 报错信息 "mybatis-plus mysql8.0 group 1055 - Expression #1" 指的是在使用MyBatis-Plus操作MySQL数据库时遇到了错误。这个错误通常是由于MySQL 8.0版本的SQL模式中引入了ONLY_FULL_GROUP_BY&#xff0c;这个规…

JAVA:使用ServerSocket实现多线程的服务器功能

目录 一、服务端 二、Task任务类。 三、客户端请求 一、服务端 创建数据源&#xff0c;并实现ServerSocket&#xff0c;当有连接进来时&#xff0c;创建Task任务类&#xff0c;交由线程池处理&#xff0c;主程序在s.accept();继续等待新的连接&#xff08;这个等待是阻塞制的…

手写一个vue2的diff案例

一、Vue为什么需要采用虚拟DOM&#xff1f; 虚拟 DOM 在 Vue 中起到了优化性能、提供跨平台兼容性 以及简化开发流程的作⽤。 虚拟 DOM 可以减少直接操作实际 DOM 的次数。虚拟 DOM 是⼀个抽象层&#xff0c;将实际 DOM 抽象为⼀个跨平台 的表示形式。使得vue 可以在不同的平…

yangwebrtc x86_64环境搭建

版本&#xff1a;5.0.099 sudo apt-get install libxext-dev sudo apt-get install x11proto-xext-dev sudo apt-get install libxi-dev sudo apt install libasound2-dev sudo apt install libgl1-mesa-dev sudo apt-get install libxtst-dev 用qt打开以下两个项目的.pro met…

WPF快速学习入门(8.视觉树和逻辑树)

WPF视觉树和逻辑树学习教程 WPF&#xff08;Windows Presentation Foundation&#xff09;是一种用于构建桌面应用程序的UI框架。在WPF中&#xff0c;有两种重要的树结构&#xff1a;视觉树和逻辑树。本文将介绍这两种树结构的概念、用途以及如何在实际项目中使用它们。 1. 视…

探索UWB模块的多功能应用——UWB技术赋能智慧生活

超宽带&#xff08;Ultra-Wideband, UWB&#xff09;技术&#xff0c;凭借其高精度、低功耗和强抗干扰能力&#xff0c;正在成为智能家居领域的一项关键技术。UWB模块的应用不仅提高了智能家居设备的性能&#xff0c;还为家庭安全、设备管理和用户体验带来了显著的改善。 UWB模…

pycharm 上一次编辑位置不见了

目录 pycharm2024版 上一次编辑位置不见了&#xff0c;研究发现移到了左下角了&#xff0c;如下图所示&#xff1a; 上一次编辑位置快捷键&#xff1a; pycharm2024版 上一次编辑位置不见了&#xff0c;研究发现移到了左下角了&#xff0c;如下图所示&#xff1a; 上一次编辑…

Windows 80端口占用解决办法

启动软件系统前&#xff0c;有时遇见端口被其他程序占用&#xff0c;导致无法启动系统 解决办法: # 查看端口占用情况 > netstat -ano | findstr 端口号通常端口占用&#xff0c;通过任务管理器查看PID&#xff0c;结束任务可以完成。System进程占用&#xff0c;结束不了&…

惯性动作捕捉与数字人实时交互/运营套装,对高校元宇宙实训室有何作用?

惯性动作捕捉与数字人实时交互/运营套装&#xff0c;可以打破时空限制&#xff0c;通过动捕设备写实数字人软件系统动捕设备系统定制化数字人短视频渲染平台&#xff0c;重塑课程教学方式&#xff0c;开展元宇宙沉浸式体验教学活动和参观交流活动。 写实数字人软件系统内置丰富…

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月31日预测第7弹

昨天的3D已命中&#xff01;今天继续基于8883的大底&#xff0c;使用尽可能少的条件进行缩号。好了&#xff0c;直接上结果吧~ 首先&#xff0c;888定位如下&#xff1a; 百位&#xff1a;7,6,5,8,9,3,2,0 十位&#xff1a;3,4,5,2,1,7,8,9 …

视频汇聚EasyCVR平台GA/T 1400视图库应用:助力社会治安防控效能提升

在信息化、智能化的时代浪潮下&#xff0c;公安视频图像信息应用系统的发展与应用显得尤为重要。GA/T 1400标准&#xff0c;全称为《公安视频图像信息应用系统》&#xff0c;作为公安行业的一项重要标准&#xff0c;其视图库的应用在提升公安工作效能、加强社会治安防控等方面发…

C#中的空合并运算符与空合并赋值运算符:简化空值处理

在C#编程中&#xff0c;处理可能为null的值是一项常见的任务&#xff0c;尤其是在涉及数据库查询、Web服务调用或任何可能返回缺失数据的场景中。为了简化这类操作并提高代码的可读性&#xff0c;C# 8 引入了两个非常实用的运算符&#xff1a;空合并运算符 (??) 和 空合并赋值…

小白跟做江科大32单片机之按键控制LED

原理部分 1.LED部分使用的是这样的连接方式 2.传感器模块的电路图 滤波电容如果接地&#xff0c;一般用于滤波&#xff0c;在分析电路时就不用考虑。下面这个电路就是看A端和B端哪端的拉力大&#xff0c;就能把电压值对应到相应的电压值 比较器部分 如果A端电压>B端电压&am…