WebSocket与实时通讯技术

发布时间: 2023-12-16 04:03:52 阅读量: 18 订阅数: 15
# 一、WebSocket简介 ## 1.1 传统通讯方式的局限性 传统的HTTP通信协议使用的是"请求-响应"模式,即客户端发送请求,服务器响应请求,这种方式在实时通讯场景下存在一定的局限性。例如,聊天应用中需要频繁地向服务器发送请求来获取新消息,这种轮询的方式既浪费了带宽又增加了服务器的负载。此外,HTTP协议不支持服务器主动向客户端发送消息,需要客户端不断地发送请求才能获取消息,效率低下。 ## 1.2 WebSocket的定义与特点 WebSocket是一种全双工通信协议,允许客户端和服务器之间进行实时的双向通讯。它基于HTTP协议,但是与HTTP有所不同,WebSocket客户端与服务器只需要进行一次握手,之后就可以通过建立的连接进行双向通讯,不再需要发送多余的HTTP请求。相比于传统的HTTP通信,WebSocket具有实时性好、效率高、数据传输量小等特点。 ## 1.3 WebSocket与HTTP/HTTPS的对比 - 连接方式:HTTP协议使用"请求-响应"模式,需要客户端发送请求,服务器响应请求。而WebSocket通过一次握手后建立连接,客户端和服务器可以进行双向通信。 - 数据传输量:由于不需要频繁地发送HTTP请求,WebSocket的数据传输量相对较小,减少了网络负载。 - 实时性:WebSocket的实时性较好,可以实时地推送消息给客户端,而HTTP协议需要客户端不断发送请求来获取新数据。 ### 二、WebSocket的工作原理 #### 2.1 握手过程 WebSocket的握手过程与HTTP的握手过程类似,但存在一些细微的差别。下面是WebSocket握手的具体步骤: 1. 客户端发送HTTP请求到服务器,请求中包含Upgrade字段,表明客户端希望升级协议为WebSocket。 2. 服务器收到请求后,进行判断是否支持WebSocket协议。如果支持,则生成随机的WebSocket协议版本号,并返回响应。 3. 客户端收到响应后,进行验证服务器返回的状态码以及协议版本号是否匹配。如果匹配,则客户端认可服务器的WebSocket支持。 4. 合法的握手完成后,双方可以通过WebSocket进行实时通讯。 以下是一段用Python实现WebSocket握手的示例代码: ```python import socket import base64 import hashlib # WebSocket握手 def handshake(client_socket): # 读取客户端的请求数据 request_bytes = client_socket.recv(1024) request = request_bytes.decode() # 获取Sec-WebSocket-Key字段的值 key = '' for line in request.split('\r\n'): if 'Sec-WebSocket-Key' in line: key = line.split(':')[1].strip() # 生成响应的Sec-WebSocket-Accept字段的值 magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' accept_key = base64.b64encode(hashlib.sha1((key + magic_string).encode()).digest()).decode() # 构造响应 response = "HTTP/1.1 101 Switching Protocols\r\n" response += "Upgrade: websocket\r\n" response += "Connection: Upgrade\r\n" response += "Sec-WebSocket-Accept: " + accept_key + "\r\n\r\n" # 发送响应到客户端 client_socket.send(response.encode()) # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('127.0.0.1', 8000)) server_socket.listen(5) while True: # 等待客户端连接 print('Waiting for connection...') client_socket, address = server_socket.accept() print('Connected with', address) # 进行握手 handshake(client_socket) # 后续处理... ``` 上述代码中,通过创建一个服务器socket对象,并监听8000端口。当有客户端连接时,会进行WebSocket的握手过程。握手过程中,服务器会读取客户端的握手请求,并生成响应数据返回给客户端,完成握手。 #### 2.2 数据传输方式 WebSocket支持全双工、双向通信,可以实现服务器主动向客户端推送消息。数据传输过程中,采用帧(Frame)的方式进行。 每个WebSocket帧由多个字节组成,包含以下几个部分: - **Fin(1 bit)**:表示是否是消息的最后一个帧。 - **Opcode(4 bits)**:标识数据的类型,常用的有文本(Text)帧和二进制(Binary)帧。 - **Mask(1 bit)**:用于掩码处理,WebSocket规定客户端发送的帧必须进行掩码处理。 - **Payload length(7 bits或7 + 16 bits或7 + 64 bits)**:标识负载数据的长度。 - **Masking key(0或4 bytes)**:只有在Mask为1时才存在,用于解码负载数据。 - **Payload data(变长)**:存储实际的负载数据。 以下是一段用Python实现发送WebSocket文本帧的示例代码: ```python import struct import socket def send_text_message(client_socket, message): message = message.encode() header = b'\x81' payload_length = len(message) if payload_length <= 125: header += struct.pack('!B', payload_length) elif 126 <= payload_length <= 65535: header += b'\x7e' + struct.pack('!H', payload_length) else: header += b'\x7f' + struct.pack('!Q', payload_length) data = header + message client_socket.send(data) # 创建socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('127.0.0.1', 8000)) while True: message = input('Please enter mes ```
corwn 最低0.47元/天 解锁专栏
赠618次下载
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

SW_孙维

开发技术专家
知名科技公司工程师,开发技术领域拥有丰富的工作经验和专业知识。曾负责设计和开发多个复杂的软件系统,涉及到大规模数据处理、分布式系统和高性能计算等方面。
专栏简介
《Web全栈》专栏涵盖了Web开发领域的各个关键知识点,旨在帮助读者全面理解并掌握全栈开发的基本概念与技术要点。从前端到后端,从基础知识到高级应用,专栏内容全面而深入。通过《理解Web全栈开发的基本概念》,读者可以建立对全栈开发的整体认识;《HTML5与CSS3:构建现代Web页面的基础》讲述了构建页面的基本工具;《JavaScript基础:从语法到DOM操作》带领读者深入了解前端开发的核心语言;而《Node.js基础:服务器端JavaScript的崛起》则展现了后端技术的强大魅力。同时,专栏还介绍了现代的前端框架如Vue.js和React与Redux,并深入探讨了数据库基础、RESTful API设计与实践、PWA技术和微服务架构等主题。无论是对于初学者还是有经验的开发者,本专栏都将是一个全面且系统的学习资源,能够帮助读者快速掌握并应用于实践中。
最低0.47元/天 解锁专栏
赠618次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

Python Lambda函数在DevOps中的作用:自动化部署和持续集成

![Python Lambda函数在DevOps中的作用:自动化部署和持续集成](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/930a322e6d5541d88e74814f15d0b07a~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?) # 1. Python Lambda函数简介** Lambda函数是一种无服务器计算服务,它允许开发者在无需管理服务器的情况下运行代码。Lambda函数使用按需付费的定价模型,只在代码执行时收费。 Lambda函数使用Python编程语言编写

Python变量作用域与云计算:理解变量作用域对云计算的影响

![Python变量作用域与云计算:理解变量作用域对云计算的影响](https://pic1.zhimg.com/80/v2-489e18df33074319eeafb3006f4f4fd4_1440w.webp) # 1. Python变量作用域基础 变量作用域是Python中一个重要的概念,它定义了变量在程序中可访问的范围。变量的作用域由其声明的位置决定。在Python中,有四种作用域: - **局部作用域:**变量在函数或方法内声明,只在该函数或方法内可见。 - **封闭作用域:**变量在函数或方法内声明,但在其外层作用域中使用。 - **全局作用域:**变量在模块的全局作用域中声明

Python生成Excel文件:开发人员指南,自动化架构设计

![Python生成Excel文件:开发人员指南,自动化架构设计](https://pbpython.com/images/email-case-study-process.png) # 1. Python生成Excel文件的概述** Python是一种功能强大的编程语言,它提供了生成和操作Excel文件的能力。本教程将引导您了解Python生成Excel文件的各个方面,从基本操作到高级应用。 Excel文件广泛用于数据存储、分析和可视化。Python可以轻松地与Excel文件交互,这使得它成为自动化任务和创建动态报表的理想选择。通过使用Python,您可以高效地创建、读取、更新和格式化E

优化Python连接SQL Server的连接池:提高性能和稳定性

![优化Python连接SQL Server的连接池:提高性能和稳定性](https://img-blog.csdnimg.cn/img_convert/f46471563ee0bb0e644c81651ae18302.webp?x-oss-process=image/format,png) # 1. Python连接SQL Server的连接池概述 连接池是一种用于管理数据库连接的机制,它可以显著提高数据库访问的性能和稳定性。在Python中,连接池可以通过第三方库或自行实现的方式来实现。 连接池的主要优势在于它可以减少数据库连接的建立和销毁次数,从而降低数据库服务器的负载并提高应用程序

Python3.7.0安装与最佳实践:分享经验教训和行业标准

![Python3.7.0安装与最佳实践:分享经验教训和行业标准](https://img-blog.csdnimg.cn/direct/713fb6b78fda4066bb7c735af7f46fdb.png) # 1. Python 3.7.0 安装指南 Python 3.7.0 是 Python 编程语言的一个主要版本,它带来了许多新特性和改进。要开始使用 Python 3.7.0,您需要先安装它。 本指南将逐步指导您在不同的操作系统(Windows、macOS 和 Linux)上安装 Python 3.7.0。安装过程相对简单,但根据您的操作系统可能会有所不同。 # 2. Pyt

Python Requests库:常见问题解答大全,解决常见疑难杂症

![Python Requests库:常见问题解答大全,解决常见疑难杂症](https://img-blog.csdnimg.cn/direct/56f16ee897284c74bf9071a49282c164.png) # 1. Python Requests库简介 Requests库是一个功能强大的Python HTTP库,用于发送HTTP请求并处理响应。它提供了简洁、易用的API,可以轻松地与Web服务和API交互。 Requests库的关键特性包括: - **易于使用:**直观的API,使发送HTTP请求变得简单。 - **功能丰富:**支持各种HTTP方法、身份验证机制和代理设

Python Excel读写项目管理与协作:提升团队效率,实现项目成功

![Python Excel读写项目管理与协作:提升团队效率,实现项目成功](https://docs.pingcode.com/wp-content/uploads/2023/07/image-10-1024x513.png) # 1. Python Excel读写的基础** Python是一种强大的编程语言,它提供了广泛的库来处理各种任务,包括Excel读写。在这章中,我们将探讨Python Excel读写的基础,包括: * **Excel文件格式概述:**了解Excel文件格式(如.xlsx和.xls)以及它们的不同版本。 * **Python Excel库:**介绍用于Python

PyCharm Python路径与移动开发:配置移动开发项目路径的指南

![PyCharm Python路径与移动开发:配置移动开发项目路径的指南](https://img-blog.csdnimg.cn/20191228231002643.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzQ5ODMzMw==,size_16,color_FFFFFF,t_70) # 1. PyCharm Python路径概述 PyCharm是一款功能强大的Python集成开发环境(IDE),它提供

Python字符串为空判断的自动化测试:确保代码质量

![Python字符串为空判断的自动化测试:确保代码质量](https://img-blog.csdnimg.cn/direct/9ffbe782f4a040c0a31a149cc7d5d842.png) # 1. Python字符串为空判断的必要性 在Python编程中,字符串为空判断是一个至关重要的任务。空字符串表示一个不包含任何字符的字符串,在各种场景下,判断字符串是否为空至关重要。例如: * **数据验证:**确保用户输入或从数据库中获取的数据不为空,防止程序出现异常。 * **数据处理:**在处理字符串数据时,需要区分空字符串和其他非空字符串,以进行不同的操作。 * **代码可读

Jupyter Notebook安装与配置:云平台详解,弹性部署,按需付费

![Jupyter Notebook安装与配置:云平台详解,弹性部署,按需付费](https://ucc.alicdn.com/pic/developer-ecology/b2742710b1484c40a7b7e725295f06ba.png?x-oss-process=image/resize,s_500,m_lfit) # 1. Jupyter Notebook概述** Jupyter Notebook是一个基于Web的交互式开发环境,用于数据科学、机器学习和Web开发。它提供了一个交互式界面,允许用户创建和执行代码块(称为单元格),并查看结果。 Jupyter Notebook的主