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 操作和事件循環的特性,可以在網絡編程中實現高效的并發處理。這使得程序能夠有效地處理大量的并發連接,提高了性能和資源利用率。在編寫異步套接字編程代碼時,需要關注異常處理、超時處理以及其他安全性和性能方面的考慮。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165357.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165357.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git與ssh多賬戶共存

git與ssh多賬戶共存 前言git多賬戶ssh多公鑰參考 前言 在使用git與ssh時,經常會遇到多個賬戶共存的情況 例如使用不同的公鑰登陸到不同的服務;使用不同的git信息進行commit git多賬戶 在默認情況下 git的信息存在 ~/.gitconfig 可以使用命令查看 git…

關于elementui和ant design vue無法禁止瀏覽器自動填充問題

以and design vue 為例&#xff1a; 圖標用來顯隱賬號密碼 html&#xff1a; <a-form-model-item label"賬號密碼:" prop"password"><a-input v-if"passwordTab" ref"passwordInput" v-model"form.password" typ…

詳解最長公共子序列問題(三種方法)

這里&#xff0c;為了更方便地解釋&#xff0c;我以洛谷上的一道典型題目為例&#xff0c;為大家講解處理最長公共子序列問題的幾種常見方法。這道題目中規定了兩個子序列的長度相等&#xff0c;如果遇到不等的情況&#xff0c;也只需要對長度稍作修改即可&#xff0c;算法思想…

qs-一個序列化和反序列化的JavaScript庫

起因 一個業務場景中&#xff0c;最終得到一串字符"status[0]value1&status[1]value2" 通過解析&#xff0c;理應得到一個數組&#xff0c;卻得到一個對象 于是展開問題排查 最終發現是qs.parse 這個地方出了問題 排查結果 qs解析這種帶下標的字符串時&#xff…

基于python的NBA球員數據可視化分析的設計與實現

完整下載&#xff1a;基于python的NBA球員數據可視化分析的設計與實現.docx 基于python的NBA球員數據可視化分析的設計與實現 Design and Implementation of NBA Player Data Visualization Analysis based on Python 目錄 目錄 2 摘要 3 關鍵詞 4 第一章 引言 4 1.1 研究背景 …

【Java 進階篇】Redis 命令操作:輕松掌握基本操作

Redis是一款高性能的鍵值對存儲系統&#xff0c;以其快速、靈活的特性而備受開發者推崇。本文將詳細介紹Redis的基本命令操作&#xff0c;包括鍵值操作、數據查詢、事務處理等方面&#xff0c;幫助初學者更好地理解和使用Redis。 基本命令 1. 鍵值操作 1.1 SET&#xff1a;設…

spark shuffle 剖析

ShuffleExchangeExec private lazy val writeMetrics SQLShuffleWriteMetricsReporter.createShuffleWriteMetrics(sparkContext)private[sql] lazy val readMetrics SQLShuffleReadMetricsReporter.createShuffleReadMetrics(sparkContext)用在了兩個地方&#xff0c;承接的是…

目標檢測YOLO系列從入門到精通技術詳解100篇-【目標檢測】SLAM(基礎篇)(三)

目錄 前言 移動機器人視覺SLAM回環檢測 01 回環檢測問題描述 02 主流回環檢測方法 2.1 根據路標點先驗信息

【Flink】Standalone運行模式

獨立模式是獨立運行的&#xff0c;不依賴任何外部的資源管理平臺&#xff1b;當然獨立也是有代價的&#xff1a;如果資源不足&#xff0c;或者出現故障&#xff0c;沒有自動擴展或重分配資源的保證&#xff0c;必須手動處理。所以獨立模式一般只用在開發測試或作業非常少的場景…

Ps:參考線

參考線 Guides用于幫助精確地定位圖像或元素&#xff0c;顯示為浮動在圖像上的非打印線&#xff0c;可以移動或移除&#xff0c;還可以臨時鎖定。 Ps 中的參考線可分為三大類&#xff1a;畫布參考線、畫板參考線和智能參考線。 可在“首選項/參考線、網格和切片”中設置參考線的…

C 標準庫 - <stddef.h>和<stdio.h>詳解

目錄 C 標準庫 - 簡介 庫變量 庫宏 實例 C 標準庫 - 簡介 庫變量 庫宏 庫函數 實例 C 標準庫 - <stddef.h> 簡介 <stdio.h> 是 C 語言中的一個標準庫&#xff0c;它提供了一些常用的函數和類型定義&#xff0c;用于處理與大小相關的操作。 庫變量 …

深信服防火墻路由模式開局部署-手把手教學(小白篇)

PS&#xff1a;深信服的設備只有400能夠通過console連接&#xff0c;一般用戶是無法連接的&#xff0c;所以大家不要妄想著從Console連接設備了&#xff0c;開局就通過MANAGE進入Web就可以 接通電源后&#xff0c;開機拿一根網線&#xff0c;一端連接防火墻的MANAGE口&#xf…

uniapp uni.navigateBack返回后刷新頁面數據

方法1: 父頁面設置鉤子函數(onBackPress): 頁面簡介 | uni-app官網 適用于刷新多處數據 onBackPress(options) {this.refreshData(); }, methods:{refreshData: function() {//加載數據}, }, 方法2: 返回加success回調 uni.navigateBack({delta: 1, //返回層數&#xff0…

【C++】泛型編程 ? ( 類模板示例 - 數組類模板 | 容器思想 | 自定義類可拷貝 - 深拷貝與淺拷貝 | 自定義類可打印 - 左移運算符重載 )

文章目錄 一、容器思想1、自定義類可拷貝 - 深拷貝與淺拷貝2、自定義類可拷貝 - 代碼示例3、自定義類可打印 - 左移運算符重載 二、代碼示例1、Array.h 頭文件2、Array.cpp 代碼文件3、Test.cpp 主函數代碼文件4、執行結果 一、容器思想 1、自定義類可拷貝 - 深拷貝與淺拷貝 上…

百戰python02-語言元素

文章目錄 指令與程序變量與類型變量命名變量的使用運算符賦值運算符比較運算符和邏輯運算符練習1:華氏溫度轉換為攝氏溫度練習2:輸入圓的半徑計算計算周長和面積練習3:輸入年份判斷是不是閏年字符串常用操作注:需要對python有基本了解,可查看本作者python基礎專欄,有任何問…

大模型生態新篇章:以AI Agent為引,助企業創新應用落地

文 | 智能相對論 作者 | 沈浪 以聊天機器人、虛擬助手、智能客服等為代表的對話式人工智能 (Conversational AI Agents ) 在具體服務場景中的應用已經十分普遍。今年以來&#xff0c;隨著大模型技術的爆發與加持&#xff0c;對話式AI被市場賦予了更高的期望。 “所有行業都值…

Spring 事務失效的7種場景, 事務失效后如何進行處理

文章目錄 簡單說說spring事務失效的場景Spring 事務失效的7種場景1.1、未啟用[spring事務管理](https://so.csdn.net/so/search?qspring事務管理&spm1001.2101.3001.7020)功能1.2、方法不是public類型的1.3、數據源未配置事務管理器1.4、自身調用問題1.5、異常類型錯誤1.6…

《golang設計模式》第三部分·行為型模式-07-觀察者模式(Observer)/發布者—訂閱者模式

文章目錄 1. 概念1.1 角色1.2 類圖 2. 代碼示例2.1 代碼2.2 類圖 1. 概念 觀察者&#xff08;Observer&#xff09;指當目標對象狀態發生變化后&#xff0c;對狀態變化事件進行響應或處理的對象。 1.1 角色 Subject&#xff08;抽象主題&#xff09;&#xff1a; 它可以有多…

微服務實戰系列之Feign

前言 不知不覺&#xff0c;“微服務實戰系列”已完成了六篇&#xff0c;每篇都聚焦一個主題&#xff0c;目的是便于各位盆友能夠快速、全面地接收和消化。 博主從服務注冊到服務監控&#xff0c;從服務路由到服務安全&#xff0c;從身份認證到加密技術均有涉獵。凡此均有關微服…

Java核心知識點整理大全10-筆記

往期快速傳送門&#xff1a; Java核心知識點整理大全-筆記_希斯奎的博客-CSDN博客文章瀏覽閱讀9w次&#xff0c;點贊7次&#xff0c;收藏7次。Java核心知識點整理大全https://blog.csdn.net/lzy302810/article/details/132202699?spm1001.2014.3001.5501 Java核心知識點整理…