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模块后,需要在…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
