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

什么是WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它被设计用于在客户端和服务器之间建立持久连接,以便实时数据交换。WebSocket 协议在 2011 年被标准化为 RFC 6455。

WebSocket 的特点

  1. 全双工通信:客户端和服务器可以同时发送和接收消息。
  2. 低延迟:由于连接是持久的,减少了建立连接的开销,适用于实时应用。
  3. 基于 TCP:WebSocket 使用 TCP 作为传输层协议。
  4. 节省带宽:相比于 HTTP 请求,WebSocket 消息头部较小,节省了带宽。

WebSocket 的工作原理

  1. 握手:客户端通过 HTTP 请求与服务器进行握手,升级协议到 WebSocket。
  2. 建立连接:握手成功后,建立持久连接,客户端和服务器可以相互发送消息。
  3. 消息传递:客户端和服务器可以通过连接发送和接收消息。
  4. 关闭连接:任一方可以随时关闭连接。

WebSocket 握手示例

客户端发送的 HTTP 请求

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

服务器响应的 HTTP 响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

WebSocket 在 JavaScript 中的使用

在浏览器中使用 WebSocket 非常简单,以下是一个基本的示例:

客户端代码

// 创建 WebSocket 连接
const socket = new WebSocket('ws://example.com/socket');// 连接打开时触发
socket.addEventListener('open', (event) => {console.log('WebSocket is open now.');socket.send('Hello Server!');
});// 接收到消息时触发
socket.addEventListener('message', (event) => {console.log('Message from server:', event.data);
});// 连接关闭时触发
socket.addEventListener('close', (event) => {console.log('WebSocket is closed now.');
});// 连接出错时触发
socket.addEventListener('error', (event) => {console.error('WebSocket error observed:', event);
});

服务器代码(Node.js 示例)

使用 ws 库在 Node.js 中创建 WebSocket 服务器:

const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', (ws) => {console.log('Client connected');ws.on('message', (message) => {console.log('Received:', message);ws.send('Hello Client!');});ws.on('close', () => {console.log('Client disconnected');});
});

WebSocket 的应用场景

  1. 实时聊天应用:如即时通讯工具和聊天室。
  2. 实时数据推送:如股票行情、体育比分更新等。
  3. 在线游戏:需要低延迟的实时通信。
  4. 协作工具:如在线文档编辑、白板应用等。

总结

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于需要实时数据交换的应用场景。它通过握手建立持久连接,客户端和服务器可以同时发送和接收消息。WebSocket 在浏览器和服务器端都得到了广泛支持,适用于各种实时应用。


http://www.mrgr.cn/news/45459.html

相关文章:

  • 1.2 Vue简介
  • 《女特警》圆满收官,白澜精湛演技获赞无数
  • 云原生生态介绍
  • [python][whl]curses-2.2.1+utf8的轮子文件whl文件下载地址汇总
  • 【Codeforces】CF 1998 D
  • 一款基于uniapp uni picker 封装的一个薪资选择插件 简易版,如有特殊需求,请自行修改源码
  • 串行异步422接口和串行同步422的异同点,分别应用于什么场景
  • Linux 配置MySQL并在C++ 中创建类快速调用
  • 文件传输工具magic-wormhole(比scp好用太多!)
  • springboot实战学习(11)(更新用户基本信息接口主逻辑)
  • 【JavaEE初阶】深入理解不同锁的意义,synchronized的加锁过程理解以及CAS的原子性实现(面试经典题);
  • 常用动词敬语形式大揭秘,柯桥零基础日语培训
  • 在 Vite 中使用 CSS 预处理器的劣势是什么?
  • 【JavaScript】JS核心语法及函数
  • 18747 关键路径
  • ai绘画变现方式全解析,教你如何通过AI绘画赚钱
  • 【Linux】进程间通信——System V消息队列和信号量
  • Nginx跳转模块之location与rewrite
  • 铲屎官有什么推荐的养宠好物吗?如何挑选宠物空气净化器?
  • 清华提出BEV感知和强化学习融合方法:实现感知和决策的无缝衔接