探秘 Python 網絡編程:構建簡單聊天服務器

????????在計算機網絡的世界里,網絡編程是實現不同設備之間通信的關鍵技術。Python 憑借其簡潔的語法和強大的庫支持,在網絡編程領域有著廣泛的應用。無論是構建簡單的聊天服務器,還是開發復雜的網絡應用,Python 都能輕松勝任。


1 理論基礎:套接字編程

????????套接字(Socket)是網絡編程的基礎概念,它是對網絡中不同主機上的應用進程之間進行雙向通信的端點的抽象。Python 的 socket 模塊提供了創建和使用套接字的接口。在網絡通信中,常見的套接字類型有 TCP 和 UDP。TCP 是一種面向連接的、可靠的傳輸協議,而 UDP 是一種無連接的、不可靠的傳輸協議。


2 構建 TCP 聊天服務器

2.1 服務器端代碼

????????我們將使用 Python 的 socket 模塊來創建一個 TCP 聊天服務器。服務器需要監聽特定的端口,等待客戶端的連接,并接收和轉發客戶端發送的消息。以下是服務器端的代碼示例:

import socket
import threading# 定義服務器地址和端口
HOST = '127.0.0.1'
PORT = 12345# 創建套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen(5)print(f"Server listening on {HOST}:{PORT}")# 存儲連接的客戶端
clients = []# 廣播消息給所有客戶端
def broadcast(message, client_socket):for client in clients:if client != client_socket:try:client.send(message)except:clients.remove(client)# 處理客戶端連接
def handle_client(client_socket):while True:try:message = client_socket.recv(1024)if not message:breakprint(f"Received message: {message.decode()}")broadcast(message, client_socket)except:breakclients.remove(client_socket)client_socket.close()# 主循環,接受客戶端連接
while True:client_socket, client_address = server_socket.accept()print(f"Accepted connection from {client_address}")clients.append(client_socket)client_handler = threading.Thread(target=handle_client, args=(client_socket,))client_handler.start()

2.2 代碼解釋

????????創建套接字:使用?socket.socket()?創建一個 TCP 套接字。

????????綁定地址和端口:使用?bind()?方法將套接字綁定到指定的地址和端口。

????????監聽連接:使用?listen()?方法使套接字進入監聽狀態,等待客戶端的連接。

????????處理客戶端連接:當有客戶端連接時,使用?accept()?方法接受連接,并為每個客戶端創建一個新的線程來處理通信。

????????廣播消息:定義一個?broadcast()?函數,將接收到的消息廣播給所有其他客戶端。

????????處理客戶端消息:在?handle_client()?函數中,不斷接收客戶端發送的消息,并調用?broadcast()?函數進行廣播。


3 構建客戶端

3.1 客戶端代碼

????????客戶端需要連接到服務器,并發送和接收消息。以下是客戶端的代碼示例:

import socket
import threading# 定義服務器地址和端口
HOST = '127.0.0.1'
PORT = 12345# 創建套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((HOST, PORT))# 接收消息
def receive_messages():while True:try:message = client_socket.recv(1024)if not message:breakprint(f"Received message: {message.decode()}")except:break# 發送消息
def send_messages():while True:message = input()client_socket.send(message.encode())# 啟動接收和發送線程
receive_thread = threading.Thread(target=receive_messages)
receive_thread.start()send_thread = threading.Thread(target=send_messages)
send_thread.start()

3.2 代碼解釋

????????創建套接字:同樣使用 socket.socket() 創建一個 TCP 套接字。

????????連接到服務器:使用 connect() 方法連接到服務器。

????????接收消息:定義一個 receive_messages() 函數,不斷接收服務器發送的消息。

????????發送消息:定義一個send_messages() 函數,從標準輸入讀取用戶輸入的消息,并發送給服務器。

????????啟動線程:分別啟動接收和發送消息的線程,實現同時接收和發送消息的功能。


4 測試聊天服務

????????啟動服務器:運行服務器端的代碼,服務器將開始監聽指定的端口。

????????啟動客戶端:運行多個客戶端的代碼,每個客戶端將連接到服務器。

????????發送消息:在客戶端輸入消息并發送,服務器將接收到消息并廣播給所有其他客戶端。


5 代碼優化與拓展思考

????????錯誤處理:在實際應用中,需要更加完善的錯誤處理機制,以應對網絡故障、客戶端異常退出等情況。

????????性能優化:對于高并發的聊天服務器,可以考慮使用異步編程模型(如 asyncio)來提高性能。

????????功能拓展:可以添加更多的功能,如私聊、文件傳輸、用戶管理等,使聊天服務器更加實用。

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

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

相關文章

Go語言Slice切片底層

Go語言(Golang)中切片(slice)的相關知識、包括切片與數組的關系、底層結構、擴容機制、以及切片在函數傳遞、截取、增刪元素、拷貝等操作中的特性。并給出了相關代碼示例和一道面試題。關鍵要點包括: 數組特性&#xf…

vue3 ts 自定義指令 app.directive

在 Vue 3 中,app.directive 是一個全局 API,用于注冊或獲取全局自定義指令。以下是關于 app.directive 的詳細說明和使用方法 app.directive 用于定義全局指令,這些指令可以用于直接操作 DOM 元素。自定義指令在 Vue 3 中非常強大&#xff0…

基于python的機器學習(五)—— 聚類(二)

一、k-medoids聚類算法 k-medoids是一種聚類算法,它是基于k-means聚類算法的一種改進。k-medoids算法也是一種迭代算法,但是它將中心點限定為數據集中的實際樣本點,而不是任意的點。 具體來說,k-medoids算法從數據集中選擇k個初…

解釋:指數加權移動平均(EWMA)

指數加權移動平均(EWMA, Exponential Weighted Moving Average) 是一種常用于時間序列平滑、異常檢測、過程控制等領域的統計方法。相比普通移動平均,它對最近的數據賦予更高權重,對舊數據逐漸“淡化”。 ? 一、通俗理解 想象你…

Spring Boot 項目基于責任鏈模式實現復雜接口的解耦和動態編排!

全文目錄: 開篇語前言一、責任鏈模式概述責任鏈模式的組成部分: 二、責任鏈模式的核心優勢三、使用責任鏈模式解耦復雜接口1. 定義 Handler 接口2. 實現具體的 Handler3. 創建訂單對象4. 在 Spring Boot 中使用責任鏈模式5. 配置責任鏈6. 客戶端調用 四、…

COMSOL仿真遇到的兩個小問題

最近跑熱仿真的時候跑出了兩個問題,上網查發現也沒什么解決方式,最后自己誤打誤撞的摸索著解決了,在這里分享一下。 問題一 我當時一準備跑仿真就彈出了這個東西,但在此之前從未遇到 然后我試著在它說的路徑中建立recoveries文件…

如何在英文學術寫作中正確使用標點符號?

標點符號看似微不足道,但它們是書面語言的無名英雄。就像熟練的指揮家指揮管弦樂隊一樣,標點符號可以確保您的寫作流暢、傳達正確的含義并引起讀者的共鳴。正如放錯位置的音符會在音樂中造成不和諧一樣,放錯位置的逗號或缺少分號也會使您的寫…

【深度學習與大模型基礎】第10章-期望、方差和協方差

一、期望 ——————————————————————————————————————————— 1. 期望是什么? 期望(Expectation)可以理解為“長期的平均值”。比如: 擲骰子:一個6面骰子的點數是1~6&#x…

JAVA虛擬機(JVM)學習

入門 什么是JVM JVM:Java Virtual Machine,Java虛擬機。 JVM是JRE(Java Runtime Environment)的一部分,安裝了JRE就相當于安裝了JVM,就可以運行Java程序了。JVM的作用:加載并執行Java字節碼(.class&#…

【數據結構與算法】——堆(補充)

前言 上一篇文章講解了堆的概念和堆排序,本文是對堆的內容補充 主要包括:堆排序的時間復雜度、TOP 這里寫目錄標題 前言正文堆排序的時間復雜度TOP-K 正文 堆排序的時間復雜度 前文提到,利用堆的思想完成的堆排序的代碼如下(包…

什么是柜臺債

柜臺債(柜臺債券業務)是指通過銀行等金融機構的營業網點或電子渠道,為投資者提供債券買賣、托管、結算等服務的業務模式。它允許個人、企業及機構投資者直接參與銀行間債券市場的交易,打破了以往僅限機構參與的壁壘。以下是綜合多…

【Android讀書筆記】讀書筆記記錄

文章目錄 一. Android開發藝術探索1. Activity的生命周期和啟動模式1.1 生命周期全面分析 一. Android開發藝術探索 1. Activity的生命周期和啟動模式 1.1 生命周期全面分析 onPause和onStop onPause后會快速調用onStop,極端條件下直接調用onResume 當用戶打開新…

Java對象內存結構詳解

Java對象內存結構詳解 Java對象在JVM內存中的存儲結構可以分為三個部分:對象頭(Header)、實例數據(Instance Data)和對齊填充(Padding)。以下是64位JVM(開啟壓縮指針)下…

【TI MSPM0】Printf重定向學習

一、新建工程 通過XDS110與電腦進行通信。 選擇這兩個引腳 需要添加這兩個頭文件 在程序中添加這三個函數即可對printf進行重定向 二、封裝函數 另一種方法 封裝一個函數,定義一個數組

深度強化學習基礎 0:通用學習方法

過去自己學習深度強化學習的痛點: 只能看到各種術語、數學公式勉強看懂,沒有建立清晰且準確關聯 多變量交互關系浮于表面,有時候連環境、代理控制的變量都混淆 模型種類繁多,概念繁雜難整合、對比或復用,無框架分析所…

asm匯編源代碼之-字庫轉換程序

將標準的16x16點陣漢字庫(下載16x16漢字庫)轉換成適合VGA文本模式下顯示的點陣漢字庫 本程序需要調用file.asm中的子程序,所以連接時需要把file連接進來,如下 C:\> tlink chghzk file 調用參數描述如下 C:\> chghzk ; 無調用參數,轉換標準庫文件(SRC16.FNT)為適合VGA…

uniapp轉換markdown

效果 AI智能體 微信小程序 流式 1.安裝Node.js 參考:2024最新版Node.js下載安裝及環境配置教程(非常詳細)_node.js 安裝-CSDN博客 2.需要克隆項目到本地或直接到項目地址下載壓縮包。 參考:uniapp中解析markdown支持網頁和小程序_uniapp ma…

用java代碼如何存取數據庫的blob字段

一.業務 在業務中我們被要求將文件或圖片等轉成 byte[] 或 InputStream存到數據庫的Blob類型的字段中. 二.Blob類型介紹 在 MySQL 中,Blob 數據類型用于存儲二進制數據。MySQL 提供了四種不同的 Blob 類型: TINYBLOB: 最大存儲長度為 255 個字節。BL…

qemu(2) -- 定制開發板

1. 前言 qemu支持自定義開發板,本文就記錄一下折騰的過程。基于qemu-10.0.0-rc3添加x210vb3s開發板。 2. 添加板卡文件 網上參考了一些文章,有些文章使用的版本和我的不一樣,折騰起來費了點時間,最后發現還是直接參考qemu中已有…

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數(決策樹、邏輯回歸、KNN、SVM)

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數(決策樹、邏輯回歸、KNN、SVM) 問題模板解題思路1. 導入必要的庫2. 加載數據3. 劃分訓練集和測試集4. 數據預處理5. 定義算法及其參數6. 存儲算法和對應指標7. 訓練模型并計算指標8. 找…