websocket实践

在这里插入图片描述

文章目录

    • 背景
    • WebSocket API
    • 使用场景
    • 优点
  • 实例
    • 步骤 1: 设置 WebSocket 服务器
    • 步骤 2: 创建客户端 HTML 页面
    • 步骤 3: 测试 WebSocket 通信
    • 注意事项
    • 实际操作
  • 参考资料

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得浏览器和服务器只需建立一个连接,就可以实现数据的双向持久交换。WebSocket 是 HTML5 的一部分,旨在在 Web 应用程序和服务器之间建立持久的通道,以便发送实时数据。

背景

在 WebSocket 出现之前,实现实时 web 应用程序较为复杂。传统的 HTTP 请求和响应模型只能实现单向通信,而且每次客户端到服务器的请求都需要建立新的连接。这意味着实时性能差、延迟高。开发者曾使用轮询、长轮询和Server-Sent事件等技术来模拟实时通信,但这些方法仍然有着延迟高和效率低等缺点。

随着实时互联网应用的需求增长,诸如即时通讯、协作工具、在线游戏和财务交易等应用需要更有效、更即时的解决方案,WebSocket 应运而生。

WebSocket 协议
WebSocket 协议由两部分组成:握手和数据传输。

  1. 握手

握手过程通过 HTTP 请求完成,称为 “WebSocket 握手”。客户端发起握手请求,通常如下:

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

如果服务器支持 WebSocket,将返回一个 HTTP 响应,如下:

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

握手完成后,HTTP 连接即被提升为 WebSocket 连接。

  1. 数据传输

一旦握手成功,客户端和服务器就可以通过新建立的 WebSocket 连接两端发送和接收数据。数据可以以「帧」的形式交换,WebSocket 协议支持文本和二进制数据的传输。

WebSocket API

在客户端(例如 Web 浏览器),WebSocket 通过简单的 JavaScript WebSocket API 进行操作。以下是一个基本的 WebSocket API 使用示例:

// 创建新的WebSocket连接
var socket = new WebSocket('ws://www.example.com/socketserver');// 连接打开的事件处理
socket.onopen = function(event) {console.log('WebSocket connection established.');// 发送数据到服务器socket.send('Hello Server!');
};// 接收到服务器数据时的事件处理
socket.onmessage = function(event) {console.log('Message from server:', event.data);
};// 连接关闭的事件处理
socket.onclose = function(event) {console.log('WebSocket connection closed.');
};// 连接发生错误时的事件处理
socket.onerror = function(error) {console.error('WebSocket error:', error);
};

使用场景

WebSocket 特别适用于需要快速、频繁或双向通信的应用程序。典型的使用场景包括:

  • 在线游戏
  • 聊天应用
  • 实时通知和更新
  • 实时协作工具
  • 实时数据流(如股票价格或体育比赛实时得分)
  • 物联网 (IoT) 控制和监控

优点

  • 减少通信延时:实时、双向的通信减少了数据传输的等待时间。
  • 减少资源消耗:与轮询等技术相比,WebSocket在保持连接开放时消耗的资源更少。
  • 全双工通信:允许同时进行客户端和服务器之间的数据传输。

实例

要演示一个使用 WebSocket 进行通信的简单示例,我们需要两个组件:一个 WebSocket 服务器以及一个静态 HTML 页面作为客户端。

步骤 1: 设置 WebSocket 服务器

首先,我们需要建立一个 WebSocket 服务器。这里我们使用 Node.js 和 ws 库来创建一个简单的 WebSocket 服务器。如果你还没有安装 Node.js,请先从 Node.js 官网 下载并安装。

在你的工作目录下,创建一个新文件 server.js 并输入以下代码:

const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', function connection(ws) {console.log('A new client connected!');ws.on('message', function incoming(message) {console.log('received: %s', message);});ws.send('Hello! Message From Server!!');
});

然后,你需要安装 ws 库。打开终端(或命令提示符),切换到包含 server.js 的目录,并运行:

npm init -y
npm install ws

之后,通过以下命令运行服务器:

node server.js

步骤 2: 创建客户端 HTML 页面

下一步是创建一个简单的客户端,通过 WebSocket 与服务器进行通信。在同一目录下创建一个新的 HTML 文件 index.html 并输入以下代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WebSocket Demo</title><script>document.addEventListener('DOMContentLoaded', function () {var ws = new WebSocket('ws://localhost:8080');ws.onopen = function () {console.log('Connected to the WebSocket server');ws.send('Hello! Message From Client!!');};ws.onmessage = function (evt) {console.log('Message from server: ' + evt.data);};});</script>
</head>
<body><h2>WebSocket Client</h2>
</body>
</html>

步骤 3: 测试 WebSocket 通信

为了测试 WebSocket 通信:

确保 WebSocket 服务器正在运行。
使用 Web 浏览器打开 index.html 文件。你可以通过双击该文件或在终端中运行一个简单的 HTTP 服务器来实现(例如,使用 Python 的 http.server 模块或 Node.js 的 http-server 包)。
以下是使用 Python 的 http.server 运行本地服务器的示例:

# 如果你有 Python 3
python -m http.server# 如果是 Python 2
python -m SimpleHTTPServer

浏览器打开 index.html 后,通过开发者工具(F12 或右键菜单 Inspect)的 console 标签页查看客户端和服务器之间的通信输出。你将能看到客户端和服务器之间互相发送的消息。

这个简单的示例展示了 WebSocket 的基本用法:建立一个持久的连接,并实现客户端与服务器之间的实时、双向通信。WebSocket 非常适合需要快速响应的 Web 应用程序,如在线游戏、聊天应用和实时交易平台。

注意事项

index.html 文件应该放置在您能够方便访问的地方。如果您仅仅是为了本地测试,那么您可以将它放在任意一个您能够通过浏览器访问的地方。这里有一些常见的选项:

  1. 直接在本地文件系统中打开:您可以将 index.html 文件放置在您的计算机上任何一个位置,然后通过在浏览器中输入文件的路径或者通过文件浏览器双击来打开它。例如,如果您的文件位于 Windows 系统的“文档”文件夹中,路径可能类似于 file:///C:/Users/YourName/Documents/index.html。

  2. 使用本地服务器:如果您的实例涉及网络请求或者您想模拟更真实的服务器环境,您可能想要将 index.html 放置在本地运行的 web 服务器的根目录(通常是 public 或 www 文件夹)。可以使用 Python、Node.js 或其他软件包创建本地服务器。

以下是使用 Python 创建本地服务器的方法:

如果您有 Python 3:

# 进入包含 index.html 的目录
cd path/to/directory
# 启动服务器,默认端口号为 8000
python -m http.server

如果是 Python 2:

# 进入包含 index.html 的目录
cd path/to/directory
# 启动服务器,默认端口号为 8000
python -m SimpleHTTPServer

如果使用的是 Node.js,您可以使用 http-server:

首先安装 http-server:

npm install -g http-server

然后运行服务器:

# 进入包含 index.html 的目录
cd path/to/directory
# 启动服务器,默认端口号为 8080
http-server

将文件放在项目目录中:如果您使用的是版本控制系统,如 git,或者您有一个项目的文件夹结构,那么将 index.html 放在项目的根目录或特定的子目录(如 src 或 public)是个好主意。
无论您将 index.html 文件放在何处,都需要确保浏览器访问的 URL 能够映射到文件系统中正确的位置。在本地服务器的情况下,服务器的根目录通常对应您执行启动命令的位置。 直接从文件系统打开时,文件路径将会被直接用作 URL。

实际操作

当我在浏览器里输入http://localhost:8000/后,浏览器得到以下返回消息在这里插入图片描述

python的http server也输出以下日志

python -m http.server
Serving HTTP on :: port 8000 (http://[::]:8000/) ...
::1 - - [06/Apr/2024 18:06:10] "GET / HTTP/1.1" 200 -
::1 - - [06/Apr/2024 18:06:10] code 404, message File not found
::1 - - [06/Apr/2024 18:06:10] "GET /favicon.ico HTTP/1.1" 404 -

打开浏览器的开发者工具,点击控制台tab,能够看到websocket的回应:
在这里插入图片描述

node js server也输出了:

node server.js
A new client connected!
received: Hello! Message From Client!!

说明我们的例子是有效的。

参考资料

MDN Web Docs: WebSocket - Mozilla 提供的 WebSocket API 文档,非常适合初学者和经验丰富的开发者。其中提供了关于如何使用 WebSocket API 的具体信息以及代码示例。

WebSocket API Specification - W3C 提供的官方 WebSocket API 规范。这是一个技术文档,详细描述了 API 的工作原理。

HTML Living Standard: WebSockets - WHATWG 提供的 HTML 规范,其中包括了 WebSocket 的定义和背景信息。

The WebSocket Protocol (RFC 6455) - 这是定义 WebSocket 协议的官方文档。对于想要深入理解协议本身的开发者来说非常有用。

WebSocket-Node - 这是一个用于 Node.js 的 WebSocket 库。如果您计划在服务器端使用 Node.js,这将是一个宝贵的资源。

ws: a Node.js WebSocket library - Node.js 的 ws 库是一个流行的 WebSocket 实现,适用于需要在服务器端使用 WebSocket 的场景。

Socket.io - Socket.io 是一个基于 WebSocket 和其他技术实现的库,它提供了附加的功能,如房间支持、事件广播等。虽然不是纯粹的 WebSocket 库,但它是构建实时应用程序的流行选择。

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

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

相关文章

怎么保证缓存与数据库的最终一致性?

目录 零.读数据的标准操作 一.Cache aside Patten--旁路模式 二.Read/Write Through Pattern--读写穿透 三.Write Back Pattern--写回 四.运用canal监听mysql的binlog实现缓存同步 零.读数据的标准操作 这里想说的是不管哪种模式读操作都是一样的&#xff0c;这是一种统一…

Linux安装最新版Docker完整教程

参考官网地址&#xff1a;Install Docker Engine on CentOS | Docker Docs 一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.6 系统&#xff0c;内核版本为3.10 1.3 安装依赖包 …

每日OJ题_两个数组dp①_力扣1143. 最长公共子序列

目录 力扣1143. 最长公共子序列 解析代码 力扣1143. 最长公共子序列 1143. 最长公共子序列 难度 中等 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样…

能不能换DB吗?--抽象工厂模式

1.1 就不能不换DB吗&#xff1f; 都是换数据库惹的祸。 "我们团队前段时间用.net的C#来开发好一个项目&#xff0c;是给一家企业做的电子商务网站&#xff0c;是用SQL Server作为数据库的&#xff0c;应该说上线后除了开始有些小问题&#xff0c;基本都还可以。而后&#…

33. UE5 RPG使用增强输入激活GameplayAbility(三)

在前面的文章&#xff0c;我们实现了使用GameplayTag和InputAction的对应绑定的数据&#xff0c;并且添加到了增强输入映射的上下文中&#xff0c;实现了通过按键打印对应的GameplayTag&#xff0c;这只是我们基础需要制作的。目的主要是为了实现在GameplayAblity上面设置对应的…

Windows命令行关机操作

cmd相关备忘 1. 导语2. Windows本命操作3. 实用命令集合3.1. 一段时间后关机3.2. 立即关机命令3.3. 一段时间后重启3.4. 休眠命令3.5. 取消指令 &#x1f609; 记录一些不常用有的时候很救命的cmd命令 1. 导语 不知道小伙伴们有么有遇到过这样尴尬的时候&#xff0c;电脑的鼠标…

Vue - 你会在同一个元素上使用v-for和v-if吗

难度级别:初级及以上 提问概率:50% 在初学者看来,v-for和v-if同时使用是非常方便的,二者共同使用的常见场景有两种。例如有两个列表,分别用于渲染学生数据和老师数据,然后有两个单选按钮,用于切换当前页面中需要展示学生列表还是老师列…

【CicadaPlayer】视频切换/音视频同时切换

G:\CDN\all_players\CicadaPlayer-github-0.44\mediaPlayer\SuperMediaPlayer.hCicadaPlayer https://github.com/alibaba/CicadaPlayer可以clone 整个仓库的历史 git clone --bare https://github.com/username/project.git整体架构 :根据这个更容易理解:切换就是judgeFunc…

机器视觉学习(十二)—— 绘制图形

目录 一、绘制函数参数说明 1.1 cv2.line(&#xff09;绘制直线 1.2 cv2.rectangle&#xff08;&#xff09;绘制矩形 1.3 cv2.circle&#xff08;&#xff09; 绘制圆形 1.4 cv2.ellipse&#xff08;&#xff09;绘制椭圆 1.5 cv2.polylines&#xff08;&#xff09;绘制…

牛客NC93 设计LRU缓存结构【hard 链表,Map Java】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84 思路 双向链表map最新的数据放头结点&#xff0c;尾节点放最老的数据&#xff0c;没次移除尾巴节点本地考察链表的新增&#xff0c;删除&#xff0c;移动节点参考答案Java im…

Java 基于微信小程序的校园请教小程序的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…

马斯克:AI或在2030年超越人类智力

据国外媒体报道&#xff0c;马斯克日前与奇点大学和XPRIZE基金会创始人彼得戴曼迪斯&#xff08;Peter Diamandis&#xff09;进行了线上对话。 在谈及人工智能的发展速度时&#xff0c;马斯克预计&#xff0c;按照当前的技术进步速度&#xff0c;到2030年AI的智力可能超越人类…