python tcp 框架

目錄

python tcp 框架 asyncio

websockets


python tcp 框架 asyncio

import asyncio
import json
import timeclass TCPClient:def __init__(self, host, port, heartbeat_interval=10):self.host = hostself.port = portself.heartbeat_interval = heartbeat_intervalself.reader = Noneself.writer = Noneself.connected = Falseself.last_recv_time = time.time()async def connect(self):while True:try:print(f"正在連接 {self.host}:{self.port} ...")self.reader, self.writer = await asyncio.open_connection(self.host, self.port)self.connected = Trueprint("? 已連接服務器")asyncio.create_task(self.send_heartbeat())asyncio.create_task(self.receive_loop())breakexcept Exception as e:print(f"連接失敗: {e},3秒后重試")await asyncio.sleep(3)async def send_heartbeat(self):while self.connected:try:await self.send({"type": "heartbeat"})await asyncio.sleep(self.heartbeat_interval)except Exception as e:print(f"心跳發送失敗: {e}")self.connected = Falsebreakasync def receive_loop(self):try:while self.connected:data = await self.reader.readline()if not data:print("? 服務器斷開連接")self.connected = Falsebreakself.last_recv_time = time.time()try:msg = json.loads(data.decode())self.on_message(msg)except json.JSONDecodeError:print(f"收到非JSON數據: {data}")except Exception as e:print(f"接收出錯: {e}")finally:self.connected = Falseawait self.connect()  # 自動重連def on_message(self, msg):"""收到消息時觸發(你可以改成事件回調)"""print(f"📩 收到消息: {msg}")async def send(self, obj):if self.writer and not self.writer.is_closing():line = json.dumps(obj) + "\n"self.writer.write(line.encode())await self.writer.drain()else:print("? 未連接,無法發送")# === 創建全局客戶端實例 ===
client = TCPClient("127.0.0.1", 8888)async def main():await client.connect()# === 在任意地方調用發送 ===
async def send_message():await client.send({"type": "chat", "msg": "Hello Server"})if __name__ == "__main__":loop = asyncio.get_event_loop()loop.create_task(main())# 模擬3秒后在別的地方發消息loop.call_later(3, lambda: asyncio.create_task(send_message()))loop.run_forever()

websockets

安裝依賴
pip install websockets
示例代碼?python


編輯
import asyncio
import websockets
import json
import threadingSERVER_URI = "ws://127.0.0.1:8765"# 全局 websocket 引用,用于在其他地方發消息
ws_conn = Noneasync def heartbeat(ws):"""定時發送心跳包"""while True:try:await ws.send(json.dumps({"type": "ping"}))except Exception as e:print("心跳發送失敗:", e)breakawait asyncio.sleep(5)  # 心跳間隔async def listen_messages(ws):"""監聽服務器消息"""try:async for message in ws:data = json.loads(message)print("收到消息:", data)except websockets.ConnectionClosed:print("連接已關閉")async def send_message(data):"""在其他地方調用的發消息方法"""global ws_connif ws_conn:await ws_conn.send(json.dumps(data))else:print("未連接服務器,無法發送")async def main():global ws_connasync with websockets.connect(SERVER_URI) as websocket:ws_conn = websocket# 并發執行 心跳 和 收消息await asyncio.gather(heartbeat(websocket),listen_messages(websocket))def start_client():"""啟動 WebSocket 客戶端"""asyncio.run(main())def send_from_other_thread(msg):"""從其他線程發送消息"""asyncio.run(send_message({"type": "chat", "text": msg}))if __name__ == "__main__":# 啟動 WebSocket 客戶端(獨立線程)t = threading.Thread(target=start_client, daemon=True)t.start()# 等待連接建立import timetime.sleep(2)# 從主線程模擬發送消息send_from_other_thread("Hello from main thread!")# 防止主線程退出t.join()

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

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

相關文章

HTML 與 CSS:從 “認識標簽” 到 “美化頁面” 的入門指南

個人主頁:?喜歡做夢 目錄 🎠HTML 🎡一、什么是HTML? ??1.定義 ??2.核心特點 ??3.HTML的基本結構 ??4.標簽的層次結構關系 🎡二、HTML的常用標簽 🌅1.文本列表標簽 標題標簽:h…

【MATLAB 2025a】安裝離線幫助文檔

文章目錄一、在 MATLAB 設置中安裝二、從math works 網站下載ISO:適用于給無法聯網的電腦安裝或自定義路徑三、startup文件說明四、重要說明🧩🧩【Matlab】最新版2025a發布,深色模式、Copilot編程助手上線! 版本&#…

Linux系統編程Day8 -- Git 教程(初階)

往期內容回顧 基于Linux系統知識的第一個程序 自動化構建工具-make/Makefile gcc/g編譯及鏈接 Vim工具的使用 Linux常用工具&#xff08;yum與vim&#xff09; ?????? Linux系統編程Day4-- Shell與權限 回顧進度條程序的編寫&#xff1a; //.h文件內容 #include<stdio…

React18 Transition特性詳解

Transition 核心概念&#xff1a;Transition是一種標記非緊急任務更新的機制&#xff0c;它允許React在用戶交互&#xff08;如輸入&#xff09;期間保持界面的響應&#xff0c;同時準備后臺更新 主要特點&#xff1a; 區分優先級&#xff1a;可以將更新分為緊急非緊急任務可中…

OpenHarmony概述與使用

1. OpenHarmony Hi3861 學習目標與任務 硬件基礎知識&#xff1a;涵蓋嵌入式硬件體系架構&#xff08;如 MCU 基礎、硬件接口原理 &#xff09;、硬件設計流程&#xff08;原理圖繪制、PCB Layout 規范 &#xff09;&#xff0c;了解常見硬件外設&#xff08;傳感器、通信模…

大模型提示詞工程實踐:大語言模型文本轉換實踐

大模型文本轉換 學習目標 在本課程中&#xff0c;我們將探究如何使用大語言模型來完成文本轉換任務&#xff0c;例如語言翻譯、拼寫和語法檢查、語氣調整以及格式轉換。 相關知識點 大模型文本轉換 學習內容 1. 大模型文本轉換 文本轉換的核心定義與范疇 文本轉換 是指通過技術…

力扣LCR024:反轉鏈表206.反轉鏈表雙解法(經典面試題)

LCR 024. 反轉鏈表 - 力扣&#xff08;LeetCode&#xff09;LCR 024. 反轉鏈表 - 給定單鏈表的頭節點 head &#xff0c;請反轉鏈表&#xff0c;并返回反轉后的鏈表的頭節點。 示例 1&#xff1a;[https://assets.leetcode.com/uploads/2021/02/19/rev1ex1.jpg]輸入&#xff1a…

Day 6: CNN卷積神經網絡 - 計算機視覺的核心引擎

Day 6: CNN卷積神經網絡 - 計算機視覺的核心引擎 ?? 核心概念(5分鐘理解) 什么是CNN卷積神經網絡? 核心概念解釋: CNN(Convolutional Neural Network): 專門處理具有網格狀拓撲結構數據的深度學習模型,特別擅長圖像識別 為什么需要: 傳統全連接神經網絡處理圖像時參數量…

MacBook 本地化部署 Dify 指南

Dify 安裝前的準備工作 確認系統滿足最低配置要求&#xff0c;包括操作系統版本、內存、CPU 和存儲空間。 檢查是否已安裝必要的依賴項&#xff0c;如 Python、Docker 確保網絡環境穩定&#xff0c;能夠訪問所需的軟件源或鏡像倉庫。 獲取 Dify 安裝包 https://docs.dify.ai…

疫情可視化:基孔肯雅熱風險地圖實戰解析

> 一只白紋伊蚊的飛行半徑是100米,而一套WebGIS系統能將疫情防控范圍精確到每平方米。 2025年夏季,基孔肯雅熱疫情在廣東佛山爆發,短短一個月內感染病例占全省95%以上。這種由伊蚊傳播的病毒性疾病,以**突發高熱、劇烈關節痛和全身皮疹**為特征,患者關節疼痛可能持續數…

【14-模型訓練細節】

訓練步驟 1、指定輸入和輸出&#xff0c;即模型定義&#xff1b; 2、指定損失函數和成本函數&#xff1b; 3、指定訓練算法&#xff0c;如梯度下降算法&#xff1b;訓練細節 損失函數和成本函數用梯度下降算法訓練模型 主要是求成本函數的偏導數&#xff0c;使用的是反向傳播算…

ConcurrentDictionary 詳解:.NET 中的線程安全字典

什么是 ConcurrentDictionary&#xff1f; ConcurrentDictionary<TKey, TValue> 是 .NET Framework 4.0 和 .NET Core/.NET 5 中引入的線程安全字典實現&#xff0c;位于 System.Collections.Concurrent 命名空間。它解決了多線程環境下操作字典時的同步問題&#xff0c…

集成電路學習:什么是URDF Parser統一機器人描述格式解析器

URDF Parser(URDF解析器)是ROS(Robot Operating System,機器人操作系統)中用于解析URDF(Unified Robot Description Format,統一機器人描述格式)文件的工具。URDF是一種基于XML(Extensible Markup Language,可擴展標記語言)規范的格式,用于描述機器人的結構、關節、…

老式大頭顯示器(CRT)和當前最高分辨率的LED顯示器對比

老式 CRT&#xff08;陰極射線管&#xff09;和當前最頂尖的 LED&#xff08;包括 MicroLED / 高端 MiniLED / OLED&#xff09;顯示器在畫面清晰度極限相關的參數并列分析。1. 分辨率與像素密度指標老式 CRT&#xff08;PC/電視用&#xff09;頂級 LED 顯示器&#xff08;2025…

北京JAVA基礎面試30天打卡07

1. 緩存三大問題及解決方案問題場景后果常用解決方案緩存穿透請求的數據在緩存和數據庫中都不存在&#xff08;惡意攻擊或查詢異常 ID&#xff09;每次請求都會打到數據庫&#xff0c;導致 DB 壓力驟增- 緩存空值&#xff08;短期緩存不存在的 key&#xff09;- 布隆過濾器&…

后量子密碼學的遷移與安全保障:迎接量子時代的挑戰

在當今數字化時代&#xff0c;信息安全無疑是保障個人隱私、企業運營和國家安全的基石。我們依賴密碼學來保護敏感信息&#xff0c;從在線銀行交易到機密軍事通信&#xff0c;從醫療記錄的存儲到云計算中的數據傳輸&#xff0c;傳統密碼學為我們構筑起一道抵御惡意攻擊的防線。…

Android 獲取 UserAgent (UA) 的三種方式深度解析:差異、風險與最佳實踐

引言 在 Android 開發中&#xff0c;獲取 UserAgent (UA) 字符串是常見需求&#xff0c;尤其涉及網絡請求和 WebView 交互時。開發者通常使用三種方式獲取 UA&#xff1a; new WebView(context).getSettings().getUserAgentString()WebSettings.getDefaultUserAgent(context)…

Apache IoTDB 全場景部署:跨「端-邊-云」的時序數據庫 DB+AI 實戰

時序數據正成為現代工業物聯網的核心資產,從設備傳感器到業務分析,數據需跨越端、邊、云多個層級。本文將深入探討 **Apache IoTDB** 如何實現全場景統一時序數據管理,并融合AI能力實現智能決策。 --- ### 一、為什么需要「端-邊-云」協同? 在工業物聯網場景中: - **端側…

某地渣庫邊坡自動化監測服務項目

1. 項目簡介該礦山主要從事稀有金屬鉭、鈮及合金等的研發、生產、銷售和進出口業務。具有科學的管理理念、精良的工藝裝備、先進的技術水平、高素質的員工隊伍等綜合優勢&#xff0c;已形成鉭、鈮金屬及其合金材料等主要產業格局。公司產品被廣泛應用于電子、通訊、航空、航天、…

redis(2)-java客戶端使用(IDEA基于springboot)

一、準備工作首先確保&#xff1a;Linux 服務器上已安裝并啟動 Redis 服務Redis 已配置允許遠程連接&#xff08;修改 redis.conf 文件&#xff09;開發環境&#xff08;IDEA&#xff09;已準備好二、Spring Boot 項目配置 Redis1. 添加依賴在pom.xml中添加 Redis 相關依賴&…