Python 异步套接字编程
异步套接字编程是异步编程在网络通信中的应用,它使用异步 IO 操作和事件循环来实现高并发的网络应用。Python 中的 asyncio 模块提供了对异步套接字编程的支持,以下是异步套接字编程的一些重要概念和使用方法:
1. 异步套接字服务器:
异步套接字服务器通过 asyncio.start_server() 函数创建,该函数返回一个 asyncio.Server 对象,它是一个异步迭代器,可以在事件循环中进行迭代。
import asyncioasync def handle_client(reader, writer):data = await reader.read(100)message = data.decode()addr = writer.get_extra_info('peername')print(f"Received {message} from {addr}")print("Send: %r" % message)writer.write(data)await writer.drain()print("Closing the connection")writer.close()async def main():server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)addr = server.sockets[0].getsockname()print(f'Serving on {addr}')async with server:await server.serve_forever()asyncio.run(main())
在上述代码中,handle_client 函数是一个协程,用于处理客户端连接。asyncio.start_server() 创建一个异步套接字服务器,监听指定的地址和端口。通过 await server.serve_forever() 使服务器一直运行。
2. 异步套接字客户端:
异步套接字客户端使用 asyncio.open_connection() 函数创建,返回一个由 (reader, writer) 组成的元组。
import asyncioasync def send_message(message):reader, writer = await asyncio.open_connection('127.0.0.1', 8888)print(f'Send: {message!r}')writer.write(message.encode())data = await reader.read(100)print(f'Received: {data.decode()!r}')print('Closing the connection')writer.close()asyncio.run(send_message("Hello, server!"))
在上述代码中,send_message 函数是一个协程,使用 asyncio.open_connection() 函数创建一个异步套接字客户端。通过协程中的异步 IO 操作实现数据的发送和接收。
3. 异步套接字的异常处理:
在异步套接字编程中,需要特别关注异常的处理。例如,在服务器中,可能需要处理客户端连接中断的情况:
async def handle_client(reader, writer):try:data = await reader.read(100)# 处理数据except asyncio.CancelledError:print("Client connection was cancelled.")except Exception as e:print(f"An error occurred: {e}")finally:writer.close()async def main():server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)addr = server.sockets[0].getsockname()print(f'Serving on {addr}')async with server:await server.serve_forever()asyncio.run(main())
4. 异步套接字的超时处理:
在异步套接字编程中,有时需要设置超时时间,以防止长时间等待某个操作完成。可以使用 asyncio.wait_for() 函数来设置超时。
import asyncioasync def send_message_with_timeout(message):try:reader, writer = await asyncio.open_connection('127.0.0.1', 8888)await asyncio.wait_for(writer.write(message.encode()), timeout=5)data = await asyncio.wait_for(reader.read(100), timeout=5)print(f'Received: {data.decode()!r}')except asyncio.TimeoutError:print("Operation timed out.")except Exception as e:print(f"An error occurred: {e}")finally:writer.close()asyncio.run(send_message_with_timeout("Hello, server!"))
5. 异步套接字编程中的并发处理:
异步套接字编程充分利用事件循环和协程的特性,可以在单个线程中有效地处理大量并发连接。这通过异步 IO 操作的非阻塞特性实现。以下是一个简单的示例,展示如何在异步套接字服务器中处理多个并发连接: //handle_client 函数是一个协程,用于处理单个客户端连接。由于协程的非阻塞特性,事件循环可以同时处理多个连接,而不会阻塞等待 IO 操作完成。
import asyncioasync def handle_client(reader, writer):try:data = await reader.read(100)message = data.decode()addr = writer.get_extra_info('peername')print(f"Received {message} from {addr}")print("Send: %r" % message)writer.write(data)await writer.drain()print("Closing the connection")except asyncio.CancelledError:print("Client connection was cancelled.")except Exception as e:print(f"An error occurred: {e}")finally:writer.close()async def main():server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)addr = server.sockets[0].getsockname()print(f'Serving on {addr}')async with server:await server.serve_forever()asyncio.run(main())
6. 高级概念 - SSL/TLS 加密:
异步套接字编程也支持通过 SSL/TLS 进行安全的加密通信。可以使用 asyncio.start_server() 和 asyncio.open_connection() 的 ssl 参数来实现。
以下是一个简单的示例,演示了如何在异步套接字服务器和客户端中使用 SSL/TLS 加密:
import asyncio
import sslasync def handle_client(reader, writer):# 处理客户端连接# ...async def main():# 服务器端 SSL/TLS 设置ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)ssl_context.load_cert_chain(certfile='server.crt', keyfile='server.key')server = await asyncio.start_server(handle_client, '127.0.0.1', 8888, ssl=ssl_context)addr = server.sockets[0].getsockname()print(f'Serving on {addr}')async with server:await server.serve_forever()asyncio.run(main())
在客户端中也可以使用 ssl 参数,通过 ssl.create_default_context() 创建 SSL/TLS 上下文。
import asyncio
import sslasync def send_message(message):# 客户端 SSL/TLS 设置ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)ssl_context.load_verify_locations('server.crt')reader, writer = await asyncio.open_connection('127.0.0.1', 8888, ssl=ssl_context)# 发送和接收数据# ...asyncio.run(send_message("Hello, server!"))
7.总结:
异步套接字编程通过充分利用异步 IO 操作和事件循环的特性,可以在网络编程中实现高效的并发处理。这使得程序能够有效地处理大量的并发连接,提高了性能和资源利用率。在编写异步套接字编程代码时,需要关注异常处理、超时处理以及其他安全性和性能方面的考虑。
相关文章:
Python 异步套接字编程
异步套接字编程是异步编程在网络通信中的应用,它使用异步 IO 操作和事件循环来实现高并发的网络应用。Python 中的 asyncio 模块提供了对异步套接字编程的支持,以下是异步套接字编程的一些重要概念和使用方法: 1. 异步套接字服务器ÿ…...
今年的校招薪资真的让人咋舌!
秋招接近尾声,各大公司基本也陆续开奖了。这里整理了部分公司的薪资情况,数据来源于 OfferShow 和牛客网。 ps:爆料薪资的几乎都是 211 和 985 的,并不是刻意只选取学校好的。另外,无法保证数据的严格准确性。 淘天 …...
debian 设置系统默认以命令行方式启动,关闭x windows
debian 设置系统默认以命令行方式启动,关闭x windows 2021-01-02 tech linux 设置 grub启动设置在/etc/default/grub中,打开 default grub 配置: $ sudo vim /etc/default/grub修改以下配置: 更新grub,设置多用户启动: …...
AMEYA360:蔡司新能源汽车解决方案驱动产业未来
电动化正在重塑中国汽车工业。自中国汽车工业开始发展以来,在电动化和智能化的浪潮推动下,汽车行业从未面临着如此巨大的变革。得益于中国汽车产业尤其是新能源车过去十余年的激流勇进,消费者对新能源汽车的接受度也在发生转变。新能源汽车市…...
C#面试问题整理
sqlserver中视图和表的区别 在 SQL Server 中,视图(View)和表(Table)是不同的对象,它们有以下几点区别: 数据存储方式:表是一种实际存储数据的数据库对象,它包含列和行&…...
微信小程序 基于Android的共享付费自习室座位选座系统uniAPP
题目: 基于Android的共享自习室APP设计与实现 (学校要求:数据库不少于有逻辑关系的20个表,系统功能不少于60个功能点) 技术: 功能: 1. 用户端: 一、首页: (1&…...
Java中类的类型判断技巧以及没有无参构造函数时的应对策略。isInstance()方法解析
类的类型判断 基本数据类型的包装类中,例如Integer、Long这些类是没有无参构造方法的,因此在以下情况中,会出错 具体类型是未知的,只有全路径类名 String typeSte "java.lang.Integer"; Class<?> typeClass …...
基于微信小程序的员工宿舍报修系统
项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时…...
机器学习探索计划——KNN算法流程的简易了解
文章目录 数据准备阶段KNN预测的过程1.计算新样本与已知样本点的距离2.按照举例排序3.确定k值4.距离最近的k个点投票 scikit-learn中的KNN算法 数据准备阶段 import matplotlib.pyplot as plt import numpy as np# 样本特征 data_X [[0.5, 2],[1.8, 3],[3.9, 1],[4.7, 4],[6.…...
ES6之class类
ES6提供了更接近传统语言的写法,引入了Class类这个概念,作为对象的模板。通过Class关键字,可以定义类,基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新…...
17 redis集群方案
1、RedisCluster分布式集群解决方案 为了解决单机内存,并发等瓶颈,可使用此方案解决问题. Redis-cluster是一种服务器Sharding技术,Redis3.0以后版本正式提供支持。 这里的集群是指多主多从,不是一主多从。 2、redis集群的目标…...
[数据结构]—栈和队列
💓作者简介🎉:在校大二迷茫大学生 💖个人主页🎉:小李很执着 💗系列专栏🎉:数据结构 每日分享✨:到头来,有意义的并不是结果,而是我们度…...
【GridSearch】 简单实现并记录运行效果
记录了使用for循环实现网格搜索的简单框架。 使用df_search记录每种超参数组合下的运行结果。 lgb_model.best_score返回模型的最佳得分 lgb_model.best_iteration_返回模型的最佳iteration也就是最佳n_extimator import numpy as np import pandas as pd import lightgbm as …...
SecureCRT出现Key exchange failed.No compatible key exchange method. 错误解决方法
SecureCRT出现Key exchange failed.No compatible key exchange method. 如下 Key exchange failed. No compatible key exchange method. The server supports these methods: curve25519-sha256,curve25519-sha256libssh.org,diffie-hellman-group-exchange-sha256解决方法&…...
Android RGB转YUV的算法
将 ARGB(Alpha-Red-Green-Blue)颜色空间转换为 YUV(亮度-色度)颜色空间的常用算法有以下几种: 矩阵转换法 使用预定义的转换矩阵将 RGB 值转换为 YUV 值。其中,Y 表示亮度,U 和 V 表示色度。这…...
Spring事务底层原理(待完善)
EnableTransactionManagement 我们经常使用EnableTransactionManagement开启事务, 这个注解导入一个类,Import(TransactionManagementConfigurationSelector.class), 会在spring容器增加两个bean, AutoProxyRegistrar和ProxyTransactionManagementConfiguration. AutoProxyRe…...
微信小程序 修改默认单选,多选按钮样式
微信小程序 修改默认单选,多选按钮样式 1.在微信开发者文档中复制一份单选或者多选的代码 <!--pages/index3/index.wxml--> <radio-group bindchange"radioChange"><label class"weui-cell weui-check__label" style"dis…...
「最优化基础知识2」一维搜索,以及python代码
最优化基础知识(2) 无约束优化问题,一维搜索 一、一维搜索 一维搜索的意思是在一个方向上找到最小点。 用数学语言描述,X*Xk tPk,从Xk沿着Pk方向行走t到达最小点X*。 1、收敛速度: 线性收敛࿱…...
工厂模式之抽象工厂模式(常用)
抽象工厂模式 工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。 同种类称为同等级,也就是说:工厂方法模式中只考虑生产同等级的产品,但是在现实生…...
Apache服务Rwrite功能使用
Rewrite也称为规则重写,主要功能是实现浏览器访问时,URL的跳转。其正则表达式是基于Perl语言。要使用rewrite功能,Apache服务器需要添加rewrite模块。如果使用源码编译安装,–enable-rewrite。有了rewrite模块后,需要在…...
手把手教你用Python搞定CTF中的文件逆序与LSB隐写(附emoji解密)
手把手教你用Python破解CTF中的文件逆序与LSB隐写术 第一次接触CTF比赛中的MISC题目时,很多人会被那些看似普通的文件难住。一个没有后缀名的"zip"文件,一张看似平常的PNG图片,背后可能隐藏着需要层层解密的flag。本文将带你从零开…...
Loom插件安装总提示“module not found”?这不是Bug,是JDK21 EA版隐藏的启动参数开关(附生产环境灰度验证报告)
第一章:Java 项目 Loom 响应式编程转型指南Project Loom 为 Java 带来了轻量级虚拟线程(Virtual Threads)和结构化并发能力,与响应式编程范式(如 Project Reactor、R2DBC)形成互补而非替代关系。在高吞吐、…...
全栈编程基础知识1
全栈编程基础知识1 1.Java和mybatis 1.Java三大特性 - 封装:将自然界的对象封装为Java对象,属性私有化表示 - 继承:子类继承父类,extend继承 - 多态:同一个动作,不同的对象表现不同 2.==和equals对比 一个是比较的值,一个是比较的地址 3.string stringbuilder s…...
SLAM算法评测实战:除了轨迹误差,用evo分析A-LOAM还能看出什么门道?
SLAM算法评测实战:除了轨迹误差,用evo分析A-LOAM还能看出什么门道? 当你在KITTI数据集上跑完A-LOAM算法,看着evo输出的那些彩色轨迹图和误差数字时,是否曾好奇——这些结果究竟揭示了算法的哪些深层特性?作…...
IIR滤波器设计实战:从Butterworth到参数调优的完整指南
IIR滤波器设计实战:从Butterworth到参数调优的完整指南 在数字信号处理领域,IIR(无限冲激响应)滤波器因其高效的频率选择特性而广受欢迎。与FIR滤波器相比,IIR滤波器能够在相同性能要求下使用更少的计算资源ÿ…...
Markdown写作进阶:Typora + PicGo打造无缝图文体验
Markdown写作进阶:Typora PicGo打造无缝图文体验 在数字化写作时代,Markdown以其简洁高效的特性成为内容创作者的利器。传统Markdown工具常面临图片管理繁琐、排版实时性不足等问题。本文将介绍如何通过Typora与PicGo的组合,实现从写作到发…...
从无效投稿到精准命中:百考通AI如何将期刊论文的“隐形门槛”转化为清晰路标
精准匹配期刊类型,结构化写作支持,一键生成规范论文框架 “您的稿件经审阅,不适合在本刊发表,建议改投他刊。” 面对编辑部的退稿通知,你是否也曾感到迷茫?研究明明投入了大量心血,却屡屡在投稿…...
BlackSheep OpenAPI文档自动生成:打造完善的API生态系统
BlackSheep OpenAPI文档自动生成:打造完善的API生态系统 【免费下载链接】BlackSheep Fast ASGI web framework for Python 项目地址: https://gitcode.com/gh_mirrors/bl/BlackSheep BlackSheep是一款快速的Python ASGI Web框架,它提供了强大的O…...
碧蓝航线自动化终极指南:告别重复操作,让AzurLaneAutoScript接管一切
碧蓝航线自动化终极指南:告别重复操作,让AzurLaneAutoScript接管一切 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLane…...
保姆级教程:用GStreamer命令行工具gst-launch-1.0搞定音视频转码与推流
保姆级教程:用GStreamer命令行工具gst-launch-1.0搞定音视频转码与推流 在音视频处理领域,GStreamer就像一把瑞士军刀,而gst-launch-1.0则是这把军刀上最锋利的刀刃。这个看似简单的命令行工具,实际上隐藏着惊人的能力——只需一行…...
