【网络协议】WebSocket讲解

目录

webSocket简介

连接原理解析:

客户端API

服务端API(java)

实战案例

(1)引入依赖

(2)编写服务端逻辑

(3)注册配置类

 (4)前端连接 WebSocket 示例

Websocket与其他消息推送对比

总结


        大家好,我是jstart千语。相信大家或多或少都听说过webSocket,与http协议都是TCP下的一种通信协议。主要用于客户端和服务端可以相互通信的协议,与http协议不同,http协议只能由客户端想服务端发送请求后,服务端才能向客户端响应消息。而webSocket协议却可以主动向客户端发送消息,这就是全双工通信。


webSocket简介

        WebSocket 是一种基于 TCP 的网络通信协议,设计用于在客户端(通常是浏览器)和服务器之间建立一个持久化的、双向通信通道。记住最主要的一句话就可以了:实时通信。

        传统的 HTTP 协议是 请求-响应模式,不适合实时性要求高的应用。而 WebSocket 允许服务器主动向客户端推送消息,非常适合用于聊天室、在线游戏、股票行情、实时通知等场景。

全双工与半双工通信的区别:

半双工允许数据在两个方向上传输,但同一个时间段内只允许一个方向上的传输
全双工允许数据在两个方向上同时传输

特点:

WebSocket 是一种基于 TCP 的双向通信协议,它与 HTTP 一样在应用层运行,但一旦连接建立,通信通道就会一直保持开启

它具备以下特点:

  •  全双工通信:客户端和服务端都可以主动发送消息

  • 长连接:连接建立后无需频繁重连

  • 低延迟:没有 HTTP 多次握手的开销

  • 浏览器支持广泛:现代浏览器均已支持

连接原理解析:

  1. 首先还是会通过TCP的三次握手来建立连接
  2. 先由http发送一次请求,请求携带对应的请求头,告诉服务端要升级协议
  3. 如果服务端支持该协议,也响应对应的响应头,并且响应状态码设置为101,表示要切换协议
  4. 协议切换成功后,就可以使用webSocket进行双向通信了

建立流程示例: 

客户端API

示例:

<script>let ws = new WebSocket("ws://localhost/chat")ws.onopen = function(){};ws.onmessage = function(evt){//通过evt.data 可以获取服务器发送的数据};ws.onclose(){};<script>

服务端API(java)

 Tomcat的7.0.5版本开始支持WebSocket,并且实现了Java WebSocket规范。

Java WebSocket应用由一系列的Endpoint组成。Endpoint是一个java对象,代表WebSocket链接的一端,对于服务端,我们可以视为处理具体WebSocket消息的接口。

其中,Endpoint对象就是客户端与服务端建立连接时就创建的一个对象, 一个客户端对应一个Endpoint对象。每个客户端建立时都会创建一个。

Endpoint有两种定义方式:编程试和注解试:

onOpen 当开启一个新的会话时调用,该方法是客户端与服务端握手成功后调用的方法@onOpen 
onClose当会话关闭时调用@onClose
onError当连接过程异常时调用@onError

 如何向客户端发送消息?

发送消息则由 RemoteEndpoint完成,其实例由 Session维护。

        通过session.getBasicRemote获取同步消息发送的实例,然后调用其sendXxx()方法发送消息         通过session.getAsyncRemote获取异步消息发送实例,然后调用其sendXxx()方法发送消息



实战案例

(1)引入依赖

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

(2)编写服务端逻辑

@ServerEndpoint("/ws/chat")
@Component
public class ChatEndpoint {private static final Set<Session> sessions = ConcurrentHashMap.newKeySet();@OnOpenpublic void onOpen(Session session) {sessions.add(session);System.out.println("用户连接: " + session.getId());}@OnMessagepublic void onMessage(String message, Session session) {System.out.println("收到消息: " + message);// 广播给所有人for (Session s : sessions) {s.getAsyncRemote().sendText(message);}}@OnClosepublic void onClose(Session session) {sessions.remove(session);System.out.println("用户断开: " + session.getId());}@OnErrorpublic void onError(Session session, Throwable error) {System.err.println("错误: " + error.getMessage());}
}

(3)注册配置类

这个类用于识别扫描所有添加了webSocket相关注解的类

@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

 (4)前端连接 WebSocket 示例

<script>const socket = new WebSocket("ws://localhost:8080/ws/chat");socket.onopen = () => {console.log("连接已建立");socket.send("你好 WebSocket!");};socket.onmessage = (event) => {console.log("收到消息: " + event.data);};socket.onclose = () => {console.log("连接关闭");};
</script>



Websocket与其他消息推送对比

轮询方式最常见的就是扫码登录流程了,当用户页面出现一个二维码时

轮询:每隔一两秒,向服务端发送一次请求,识别该二维码有没有被扫描到,服务端响应对应的消息。缺点:当用户正好在发送某次请求后扫码,那用户也要等一两秒后才能被响应,会有明显卡顿。

长轮询:客户端想服务端发送一次请求,当服务端有数据变更时,二维码被扫描到,或者请求超时时(一般是30s)才返回信息。


SSE也是支持长连接的,也使用与服务端主动进行消息推送,但浏览器的支持没有webSocket好。而且通信也是单向的。



总结

WebSocket 是现代实时 Web 应用的重要基石,尤其在 Java 后端系统中,可以轻松通过 Spring Boot 快速构建支持高并发、低延迟的通信模块。

  • 加入权限验证(如 token 登录校验)

  • 使用 STOMP 协议进行消息分发与订阅

  • 集成 SockJS 以兼容不支持 WebSocket 的客户端

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

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

相关文章

路由器端口映射设置方法教程,和无公网IP内网穿透实现外网访问方案步骤

随着网络技术的不断发展&#xff0c;越来越多的个人和企业需要将自己的内部服务器或设备暴露给外部网络访问。这时&#xff0c;内网端口映射公网技术就显得尤为重要。下面&#xff0c;我们将分别详细介绍&#xff0c;有公网IP时如何设置路由器端口映射&#xff0c;和无公网IP内…

Linux 系统中从源码编译安装软件

以下是 Linux 系统中 从源码编译安装软件 的详细步骤和注意事项&#xff0c;帮助你掌握这一高级操作技能&#xff1a; 一、编译安装的核心流程 1. 下载源码包&#xff08;通常为 .tar.gz/.tar.bz2/.tar.xz&#xff09; 2. 解压源码包 3. 进入源码目录 4. 配置编译参数&#xf…

HTTP:二.URI及相关术语

HTTP相关技术和术语 WEB开发语言 **http:**Hyper Text Transfer Protocol 应用层协议,默认端口: 80/tcp WEB前端开发语言: htmlcssjavascripthtml Hyper Text Markup Language 超文本标记语言,编程语言,主要负责实现页面的结构 范例:html 语言 <html> <h…

Java网络编程干货

1.网络编程是什么 了解 在Java语言中&#xff0c;我们可以使用java.net包下的技术轻松开发出常见的网络应用程序&#xff0c;从而把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统&#x…

Java—HTML:CSS选择器

今天我要介绍的知识点内容是Java HTML中的CSS选择器&#xff1b; CSS选择器用于定位HTML元素并为其添加样式。它允许我们控制网页的颜色、字体、布局和其他视觉元素。通过分离内容与样式。 下面我将介绍CSS中选择器的使用&#xff0c;并作举例说明&#xff1b; 选择器基本语…

【2025蓝桥杯】赛前2小时考点梳理C++版

【2025蓝桥杯】赛前2小时考点梳理 1. &#x1f9e9; STL&#xff08;优先级最高&#xff09; 核心容器/函数 vector push_back() / pop_back() / size()string substr(pos, len) / find(str) / queue push() / front() / pop()priority_queue 默认大根堆&#xff0c;小根堆&…

汽车性能的幕后保障:慧通测控电动尾翼综合力学测试浅析

在汽车性能不断追求极致的当下&#xff0c;电动尾翼已成为众多高性能车型以及部分新能源汽车提升空气动力学表现与操控稳定性的关键配置。从炫酷的超跑到注重续航与驾驶体验的新能源车&#xff0c;电动尾翼正逐渐崭露头角。它绝非仅仅是外观上的装饰&#xff0c;而是能在车辆行…

2、文件上传漏洞的防范

原文地址:文件上传漏洞的防范 更多内容请关注&#xff1a;代码安全 PHP安全编码——书写安全的代码 文件上传漏洞的防范 提问 问题1&#xff1a;上传漏洞是怎么产生的&#xff1f; 问题2&#xff1a;是否可以只用js判断文件类型而php不判断&#xff1f; 问题3&#…

06软件测试需求分析案例-添加用户

给职业顾问部的老师添加用户密码后&#xff0c;他们才能登录使用该软件。只有admin账户具有添加用户、修改用户信息、删除用户的权利。admin是经理或团队的第一个人的账号&#xff0c;后面招一个教师就添加一个账号。 通读需求是提取信息&#xff0c;提出问题&#xff0c;输出…

Ex-Human:在DigitalOcean云平台之上,构建下一代 AI 数字人

Ex-Human 正在通过创造极具吸引力和富有同理心的人工智能角色&#xff0c;重新定义人们与人工智能的互动方式。该公司由 Artem Rodichev 创立&#xff0c;让用户能够通过文本、图像、视频和音频创建能互动的独一无二的数字人物。凭借每月超过一百万的活跃用户和五百万个定制创建…

从零实现HTTP服务器

响应&#xff1a; 第一部分测试代码&#xff0c;读取请求 Makefile binhttpserver #生成的可执行程序 ccg #编译器名称 LD_FLAGS-stdc11 -lpthread #-DDEBUG1 #链接选项 srcmain.cc$(bin):$(src)$(cc) -o $ $^ $(LD_FLAGS).PHONY:clean clean:rm -f $(bin) 1111111 main.cc…

构建高可靠C++服务框架:从日志系统到任务调度器的完整实现

构建高可靠C服务框架&#xff1a;从日志系统到任务调度器的完整实现 一、深度解析示例代码技术体系 1.1 日志系统的进阶应用 示例代码中的ZRY_LOG_XXX宏展示了基础日志功能&#xff0c;但在生产环境中我们需要更完善的日志系统&#xff1a; 推荐技术栈组合&#xff1a; sp…

小张的工厂进化史——工厂模式

小张的工厂进化史——工厂模式 一、简单工厂模式&#xff1a;全能生产线二、工厂方法模式&#xff1a;分品牌代工三、抽象工厂模式&#xff1a;生态产品族四、三种模式核心对比表五、结合Spring实现简单工厂&#xff08;实践&#xff09; 小张从华强北起家&#xff0c;最初只有…

Python中的eval()函数详解

文章目录 Python中的eval()函数详解基本语法基本用法安全性问题安全使用建议实际应用场景与exec()的区别性能考虑总结 Python中的eval()函数详解 eval()是Python的一个内置函数&#xff0c;用于执行字符串形式的Python表达式并返回结果。它是一个强大但需要谨慎使用的函数。 …

银行业务发展历史

银行业务发展历史 银行业务的发展可以追溯到古代&#xff0c;但其现代形式的发展可以追溯到中世纪。以下是银行业务发展的主要历史阶段&#xff1a; 1. 古代和中世纪时期 特点&#xff1a;商人提供贷款和存款服务&#xff0c;充当中间人转移资金&#xff0c;发行纸币作为支付…

SQL实战篇,数据库在Kooboo中的实际应用(一)

本文将结合实际操作与代码示例&#xff0c;展示SQL 在 Kooboo 中的实际应用 仅需两步&#xff1a;动态创建表 基础查询&#xff0c;无需复杂配置&#xff0c;快速上手&#xff01; 一、动态创建表&#xff1a;插入数据 Kooboo 支持多种数据库&#xff0c;以 SQLite 为例&…

克魔助手(Kemob)安装与注册完整教程 - Windows/macOS双平台指南

iOS设备管理工具克魔助手便携版使用全指南 前言&#xff1a;为什么需要专业的iOS管理工具 在iOS开发和设备管理过程中&#xff0c;开发者经常需要突破系统限制&#xff0c;实现更深层次的控制和调试。本文将详细介绍一款实用的便携式工具的使用方法&#xff0c;帮助开发者快速…

搜索插入位置 -- 二分查找

目录 一&#xff1a;题目 二:算法原理 三&#xff1a;代码分析 一&#xff1a;题目 题目链接&#xff1a;35. 搜索插入位置 - 力扣&#xff08;LeetCode&#xff09; 二:算法原理 三&#xff1a;代码分析 class Solution { public:int searchInsert(vector<int>&am…

Apache Doris内存与超时参数配置详解

一、查询任务内存限制调整 1. ​默认内存限制与问题定位 Apache Doris默认限制单个BE节点上的查询任务内存使用不超过2GB&#xff08;即exec_mem_limit2147483648字节&#xff09;。当复杂查询或大规模数据操作超过此限制时&#xff0c;会触发Memory limit exceeded错误。通过…

龙虎榜——20250411

今天缩量&#xff0c;上方压力依然在&#xff0c;外围还在升级&#xff0c;企稳还需要时日。 2025年4月11日龙虎榜行业方向分析 一、核心主线方向 半导体与芯片&#xff08;国产替代加速&#xff09; • 代表标的&#xff1a;圣邦股份&#xff08;模拟芯片&#xff09;、中电…