WebSocket 技术详解(原理 + 使用 + 面试总结)

随着 Web 应用的发展,很多场景都需要 实时通信,例如:

  • 在线聊天系统

  • 实时通知

  • 在线游戏

  • 股票行情

  • 协同编辑

传统 HTTP 协议很难满足这些需求,因此 WebSocket 技术应运而生


一、什么是 WebSocket

WebSocket 是 HTML5 提供的一种 网络通信协议 ,用于 浏览器和服务器之间建立持久连接并进行双向通信

简单理解:

WebSocket 是一种可以让浏览器和服务器进行 实时双向通信的协议

WebSocket 的特点:

  • 全双工通信(双方可以同时发送数据)

  • 长连接

  • 低延迟

  • 服务器可以主动推送消息


二、为什么需要 WebSocket

传统 Web 通信使用 HTTP 协议

HTTP 的通信模式:

复制代码
客户端 → 请求 → 服务器
服务器 → 响应 → 客户端

特点:

  • 必须由客户端发起请求

  • 服务器无法主动推送消息

如果需要实时通信,只能使用以下方案:

1 轮询(Polling)

客户端不断请求服务器

复制代码
客户端 → 请求
服务器 → 返回数据
客户端 → 再次请求

缺点:

  • 请求次数多

  • 浪费带宽

  • 服务器压力大


2 长轮询(Long Polling)

客户端请求后服务器等待数据再返回。

缺点:

  • 仍然是 HTTP

  • 连接效率不高


因此出现了 WebSocket 技术


三、WebSocket 工作原理

WebSocket 的连接建立分为两个阶段:

第一阶段:HTTP 握手

WebSocket 连接 最开始是 HTTP 请求

客户端发送请求:

复制代码
GET /chat HTTP/1.1
Host: localhost:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xxxxx

关键字段:

复制代码
Upgrade: websocket
Connection: Upgrade

表示:

请求升级为 WebSocket 协议。


服务器返回:

复制代码
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade

返回 101 状态码 表示协议升级成功。


第二阶段:建立 WebSocket 连接

握手完成后:

  • HTTP 协议结束

  • 使用 WebSocket Frame 数据帧通信

通信模式变成:

复制代码
客户端 ⇄ 服务器

双方可以 随时发送数据


四、WebSocket 通信结构

通信模型:

复制代码
客户端(Browser)
        │
        │ WebSocket
        │
服务器(Server)

数据传输单位:

复制代码
Frame(数据帧)

WebSocket 传输的是:

  • 文本数据

  • 二进制数据


五、WebSocket 与 HTTP 区别

对比 HTTP WebSocket
通信方式 请求-响应 双向通信
连接方式 短连接 长连接
数据推送 不支持 支持
实时性
开销 请求头大 数据帧小

总结:

WebSocket 更适合 实时通信场景


六、WebSocket 应用场景

常见应用:

1 在线聊天系统

例如:

  • 微信 Web

  • Slack

  • 企业聊天系统

服务器可以实时推送消息。


2 实时通知

例如:

  • 系统消息

  • 订单状态

  • 弹窗通知


3 股票行情

股票价格需要 实时刷新


4 在线游戏

游戏数据需要实时同步。


5 协同编辑

例如:

  • 在线文档

  • 多人协作编辑


七、Java WebSocket 实现(SpringBoot)

在 Java 中可以使用 SpringBoot WebSocket 实现。

首先添加依赖:

XML 复制代码
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

创建 WebSocket 服务器

java 复制代码
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/websocket")
public class WebSocketServer {

    @OnOpen
    public void onOpen(Session session){
        System.out.println("连接成功");
    }

    @OnMessage
    public void onMessage(String message){
        System.out.println("收到消息:" + message);
    }

    @OnClose
    public void onClose(){
        System.out.println("连接关闭");
    }
}

前端连接 WebSocket

javascript 复制代码
let socket = new WebSocket("ws://localhost:8080/websocket");

socket.onopen = function(){
    console.log("连接成功");
}

socket.onmessage = function(event){
    console.log("收到消息:" + event.data);
}

socket.send("hello websocket");

八、WebSocket 优点

优点:

  1. 支持全双工通信

  2. 服务器可以主动推送

  3. 减少 HTTP 请求

  4. 网络开销小

  5. 实时性高


九、WebSocket 缺点

缺点:

  1. 服务器连接数压力大

  2. 需要处理连接管理

  3. 断线重连需要自己实现


十、WebSocket 面试高频问题

1 WebSocket 和 HTTP 区别?

回答:

HTTP 是请求-响应模式,服务器不能主动推送数据,而 WebSocket 是一种全双工通信协议,可以建立长连接,服务器和客户端都可以主动发送数据,适合实时通信场景。


2 WebSocket 建立连接过程?

答案:

  1. 客户端通过 HTTP 请求发起握手

  2. 请求头包含 Upgrade: websocket

  3. 服务器返回 101 状态码

  4. 协议升级成功

  5. 建立 WebSocket 连接


3 WebSocket 是基于什么协议?

答案:

WebSocket 基于 TCP 协议。

相关推荐
仙草不加料3 小时前
互联网大厂Java面试故事实录:三轮场景化技术提问与详细答案解析
java·spring boot·微服务·面试·aigc·电商·内容社区
落魄江湖行3 小时前
基础篇一 Java 有了 int 为什么还要 Integer?它们到底差在哪?
java·面试·八股文
星辰_mya4 小时前
OSI 七层模型之“跨国诈骗集团”深度讲解
运维·服务器·后端·面试·架构师
木斯佳5 小时前
前端八股文面经大全:字节暑期前端一面(2026-04-21)·面经深度解析
前端·面试·校招·面经·实习
发光小北5 小时前
IEC104 转 Modbus TCP 网关如何应用?
网络·网络协议·tcp/ip
我叫黑大帅5 小时前
其实跨域问题是后端来解决的? CORS
后端·面试·go
掘金安东尼6 小时前
OpenMUSE 全面详解:非扩散Transformer文生图开源基座(对标GPT Image 2)
前端·javascript·面试
下次再写6 小时前
Java互联网大厂面试技术问答实战:涵盖Java SE、Spring Boot、微服务及多场景应用
java·数据库·缓存·面试·springboot·microservices·技术问答
千寻girling6 小时前
RabbitMQ 详细教程(38K字数)
java·后端·面试