WebSocket协议详解

前言

WebSocket协议是一种在单个TCP连接上进行全双工通信的应用层协议,位于OSI模型的应用层。它允许服务器主动向客户端推送信息,也可以允许客户端主动向服务器发送信息。WebSocket协议的出现主要是为了解决基于HTTP/1.x的Web应用无法实现服务端向客户端主动推送的问题。虽然WebSocket协议在建立连接时会使用HTTP协议,但这并不意味着WebSocket协议是基于HTTP协议实现的。

连接建立过程

WebSocket协议的建立连接过程如下:

  1. 客户端发送一个HTTP请求到服务器,请求中包括希望升级为WebSocket协议的信息,即在请求头中包含Upgrade字段,值为"websocket"。
  2. 服务器收到请求后,会返回一个HTTP 101状态码,表示同意升级为WebSocket协议,同时在响应头中添加Upgrade字段和Connection字段,告知客户端已升级为WebSocket协议。
  3. 客户端收到服务器的响应后,会通过TCP通道进行传输通信。

主要特点

WebSocket协议有以下几个特点:

  1. 单一的TCP连接:WebSocket协议使用单一的TCP连接进行全双工通信,避免了传统的HTTP协议需要建立多个连接的缺陷。
  2. 双向平等对话:WebSocket协议允许客户端和服务器任意时刻发送信息,不再需要轮询或者主动连接。
  3. 头部信息、Cookie和身份验证:WebSocket协议没有头部信息、Cookie和身份验证等开销,因此性能开销小,通信效率高。
  4. 保持链路激活:通过“ping/pong”帧来保持链路激活,避免因长时间无数据交互而断开连接。
  5. 全双工模式:WebSocket是真正意义上的全双工模式,即客户端和服务器可以随时发送信息。
  6. 与HTTP协议的良好兼容性:WebSocket建立在TCP协议上,与HTTP协议有着良好的兼容性,握手阶段采用HTTP协议,因此能通过各种HTTP代理服务器进行传输。
  7. 可以发送文本或二进制数据:WebSocket协议可以发送文本或二进制数据,满足不同的数据传输需求。
  8. 无同源限制:WebSocket客户端可以与任意服务器通信,没有同源限制。

以上是WebSocket协议的主要特点,它为http等应用层协议提供服务,解决了传统HTTP/1.x协议无法实现服务端向客户端主动推送信息的缺陷,使得实时通信变得更加高效和便捷。

优点和缺点

WebSocket协议的优点包括:

  1. 减少请求费时费资源:通过真正的全双工方式,建立连接后,服务器与客户端可以完全对等,可以相互请求,减少了不必要的网络请求时间损耗和网络流量。
  2. 持久连接:WebSocket协议通过第一个request建立TCP连接后,只要不主动关闭,就能一直保持连接状态交换数据。
  3. 服务端可以主动向客户端发送消息。
  4. 使用场景广泛:WebSocket的使用场景包括社交聊天、弹幕、多玩家游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、基于位置的应用、在线教育、智能家居等需要高实时的场景。

WebSocket协议的缺点包括:

  1. 协议较复杂,不是所有浏览器都支持,如果连接失败或丢失连接可能会产生一些问题。

以上是WebSocket协议的优点和缺点,在使用时可以结合这些特点进行综合考虑。

应用场景

WebSocket协议的应用场景包括但不限于:

  1. 社交应用:实现实时聊天、实时消息推送等功能,使得社交应用更加互动、高效。
  2. 游戏开发:用于实现游戏服务器与客户端之间的实时通信,支持多人在线游戏和实时互动。
  3. 实时数据传输:例如金融交易系统、实时数据分析系统等,用于实时传输数据。
  4. 实时控制:用于实现远程控制、自动化设备等需要实时反馈的场景。
  5. 实时监控:例如监控设备状态、监控交通流量等实时监控系统。

WebSocket与HTTP的区别

WebSocket与HTTP的区别主要体现在以下几个方面:

  1. 连接方式:WebSocket需要浏览器和服务器握手进行建立连接,而HTTP是浏览器发起向服务器的连接,服务器预先并不知道这个连接。
  2. 连接长度:WebSocket是持久连接,而HTTP是短连接,即HTTP是可以通过Ajax一直发送请求和长轮循保持一段时间内的连接,但本质上还是短连接。
  3. 连接状态:WebSocket是有状态的双向连接,而HTTP是无状态的双向连接。
  4. 通信方式:WebSocket是一种双向通信协议,模拟Socket协议,可以双向发送或接受信息,而HTTP是单向的。
  5. 兼容性:WebSocket和HTTP都是基于TCP协议,且兼容性都很好。在连接的建立过程中,对错误的处理方式相同,都使用Request/Response模型进行连接的建立。

总的来说,WebSocket是对HTTP协议的一种补充,解决了HTTP无法实现双向通信的问题。

Java实现WebSocket示例

下面是一个简单的Java实现WebSocket的示例代码:

import java.io.IOException;
import java.net.URI;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.java_websocket.server.WebSocketServer;public class WebSocketExample {public static void main(String[] args) {// 创建WebSocket客户端并连接服务器WebSocketClient client = new WebSocketClient(new URI("ws://localhost:8080/websocket")) {@Overridepublic void onOpen(ServerHandshake handshakedata) {System.out.println("连接成功");// 发送消息到服务器sendMessage("Hello, WebSocket!");}@Overridepublic void onMessage(String message) {System.out.println("收到服务器消息:" + message);}@Overridepublic void onClose(int code, String reason, boolean remote) {System.out.println("连接断开");}@Overridepublic void onError(Exception ex) {ex.printStackTrace();}};try {client.connectBlocking(5000); // 连接服务器,等待5秒超时} catch (InterruptedException | ExecutionException | TimeoutException e) {e.printStackTrace();}}
}

这个示例代码使用Java WebSocket API实现了一个WebSocket客户端,连接到指定的WebSocket服务器并发送/接收消息。在这个示例中,我们创建了一个WebSocketClient对象,并重写了onOpenonMessageonCloseonError方法来处理连接、消息、关闭和错误事件。然后,我们调用connectBlocking方法来连接服务器,并等待5秒钟超时。如果连接成功,我们发送一条消息到服务器,并在收到服务器消息时打印出来。如果连接断开或出现错误,我们也会打印相关的异常信息。

拓展

通过下面的链接,我们一起来来了解更多的常用的一些网络协议

HTTP/2.0协议详解

HTTP1.1协议详解

gRPC协议详解

QUIC协议详解

Dubbo协议详解

RMI协议详解

Hessian协议详解

HTTP1.0协议详解

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

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

相关文章

java文件压缩加密,使用流的方式

使用net.lingala.zip4j来进行文件加密压缩。 添加依赖net.lingala.zip4j包依赖&#xff0c;这里使用的是最新的包2.11.5版本。 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>${zip4j.versi…

微服务调用链路追踪

概述 本文介绍微服务调用链路追踪&#xff0c;涉及技术有&#xff1a;sleuth和zipkin。sleuth负责追踪调用链路数据&#xff0c;zipkin负责调用链路数据可视化展现。 本文的操作是在 服务网关实践 的基础上进行。 环境说明 jdk1.8 maven3.6.3 mysql8 spring cloud2021.0.8 …

【Python仿真】基于EKF的传感器融合定位

基于EKF的传感器融合定位&#xff08;Python仿真&#xff09; 简述1. 背景介绍1.1. EKF扩展卡尔曼滤波1.1.1.概念1.1.2. 扩展卡尔曼滤波的主要步骤如下&#xff1a;1.1.3. 优、缺点 1.2. 航位推算1.3. 目前航位算法的使用通常与卡尔曼滤波相结合使用2. 分段代码 2.1. 导入需要的…

wpf devexpress 添加GanttControl到项目

这个教程示范如何添加GanttControl 到你的项目使用内置GanttControl数据类。 要求 添加 Devexpress.Wpf.Gantt Nuget包到你的项目使用GanttControl. 数据模型 GanttControl携带和内置数据对象&#xff0c;可以使用创建视图模型&#xff1a; GanttTask 呈现甘特图任务 Gan…

Python算法——树的最大深度和最小深度

Python中的树的最大深度和最小深度算法详解 树的最大深度和最小深度是树结构中的两个关键指标&#xff0c;它们分别表示树的从根节点到最深叶子节点的最大路径长度和最小路径长度。在本文中&#xff0c;我们将深入讨论如何计算树的最大深度和最小深度&#xff0c;并提供Python…

记录将excel表无变形的弄进word里面来

之前关于这个问题记录过一篇文章&#xff1a; 将excel中的表快速复制粘贴进word中且不变形-CSDN博客 今天记录另外一种方法&#xff1a;举例表述&#xff0c;excel表如图&#xff1a; 按F12&#xff0c;出现“另存为...”对话框&#xff0c;选择“单个文件网页”&#xff0c;…

面向对象与面向过程的区别

面向对象 以对象为中心&#xff0c;把数据封装成为一个整体&#xff0c;其他数据无法直接修改它的数据&#xff0c;将问题分解成不同对象&#xff0c;然后给予对象相应的属性和行为。 面向过程 关注代码过程&#xff0c;直接一程序来处理数据&#xff0c;各模块之间有调用与…

C#_模拟鼠标操作

一、class class MouseHelper{[DllImport("user32.dll")]public static extern bool SetCursorPos(int X, int Y);[System.Runtime.InteropServices.DllImport("user32")]public static extern int mouse_event(int dwFlags, int dx, int dy, int dwData, …

大数据-之LibrA数据库系统告警处理(ALM-12055 证书文件即将过期)

告警解释 系统每天二十三点检查一次当前系统中的证书文件&#xff0c;如果当前时间距离过期时间不足告警阈值天数&#xff0c;则证书文件即将过期&#xff0c;产生该告警。告警阈值天数的配置请参考《管理员指南》的“配置证书即将过期告警阈值”章节。 当重新导入一个正常证…

oracle-buffer cache

段&#xff0c;区&#xff0c;块。 每当新建一个表&#xff0c;数据库会相应创建一个段。然后给这个段分配一个区。 一个区包含多个块。 区是oracle给段分配空间的最小单位。 块是oracle i\o的最小单位。 原则上&#xff0c;一个块包含多行数据。 dbf文件会被划分成一个一个…

Netty Review - 核心组件扫盲

文章目录 PreNetty Reactor 的工作架构图CodePOMServerClient Netty 重要组件taskQueue任务队列scheduleTaskQueue延时任务队列Future异步机制Bootstrap与ServerBootStrapgroup()channel()option()与childOption()ChannelPipelinebind()优雅地关闭EventLoopGroupChannleChannel…

今天遇到Windows 10里安装的Ubuntu(WSL)的缺点

随着技术的发展&#xff0c;越来越多开发者转向使用 Windows Subsystem for Linux&#xff08;WSL&#xff09;在 Windows 10 上进行开发&#xff0c;也就是说不用虚拟机&#xff0c;不用准备多一台电脑&#xff0c;只需要在Windows 10/11 里安装 WSL 就能体验 Linux 系统。因此…

C# Array和ArrayList有什么区别

在C#中&#xff0c;Array和ArrayList是集合类型&#xff0c;用于存储一组元素&#xff0c;但它们之间有几个关键区别&#xff1a; 类型安全&#xff1a; Array是类型安全的&#xff0c;意味着它只能存储一种特定类型的元素。例如&#xff0c;一个int[]数组只能存储int类型的元素…

邀请报名|11月24日阿里云原生 Serverless 技术实践营 深圳站

活动简介 “阿里云云原生 Serverless 技术实践营 ” 是一场以 Serverless 为主题的开发者活动&#xff0c;活动受众以关注 Serverless 技术的开发者、企业决策人、云原生领域创业者为主&#xff0c;活动形式为演讲、动手实操&#xff0c;让开发者通过一个下午的时间增进对 Ser…

how to find gcc openbug

https://gcc.gnu.org/bugzilla/query.cgi?formatadvanced

最全的接口自动化测试思路和实战:【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具&#xff0c;并可以用来“驱动&#xff02;待测应用程序和数据的测试脚本代码&#xff0c;关键字驱动测试看上去与手工测…

mount /dev/mapper/centos-root on sysroot failed处理

今天发现centos7重启开不进去系统 通过查看日志主要告警如下 修复挂载目录 xfs_repair /dev/mapper/centos-root不行加-L参数 xfs_repair -L /dev/mapper/centos-root重启 reboot

云课五分钟-0Cg++默认版本和升级-std=c++17

前篇&#xff1a; 云课五分钟-0B快速排序C示例代码-注释和编译指令 视频&#xff1a; 云课五分钟-0Cg默认版本和升级-stdc17 文本&#xff1a; 在Linux系统中&#xff0c;可以通过以下步骤升级g&#xff1a; 打开终端&#xff0c;使用root权限或者sudo权限登录。输入以下命令…

基于灰狼算法(GWO)优化的VMD参数(GWO-VMD)

代码的使用说明 基于灰狼算法优化的VMD参数 代码的原理 基于灰狼算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;优化的VMD参数&#xff08;GWO-VMD&#xff09;是一种结合了GWO和VMD算法的优化方法&#xff0c;用于信号分解和特征提取。 GWO是一种基于群体智能的优化…

lv11 嵌入式开发 ARM指令集中(伪操作与混合编程) 7

目录 1 伪指令 2 伪操作 3 C和汇编的混合编程 4 ATPCS协议 1 伪指令 本身不是指令&#xff0c;编译器可以将其替换成若干条等效指令 空指令NOP 指令LDR R1, [R2] 将R2指向的内存空间中的数据读取到R1寄存器 伪指令LDR R1, 0x12345678 R1 0x12345678 LDR伪指令可以将任…