python之socket網絡編程

引言

在互聯網時代,網絡編程已經成為開發人員必備的技能之一。無論是Web開發、實時通信還是分布式計算,都離不開網絡編程支持Python提供的socket模塊為我們提供了簡潔而強大接口,可以輕松實現客戶端服務器之間的通信

  • Socket編程網絡編程重要部分,主要用于在不同計算機之間進行通信Python提供了一個非常強大socket庫,使得網絡編程變得簡單和靈活。本篇博文將詳細介紹Pythonsocket編程,包括基礎概念、核心組件、常用功能,并附上一個綜合的示例及其運行結果。

什么是socket

  • Socket是網絡通信的端點,它允許不同的計算機之間進行數據交換。在 Python 中,socket是通過 socket模塊來實現的。Socket通信過程主要包括創建 socket對象綁定地址監聽連接發送和接收數據等步驟。

socket套接字類型

Python 中,socket類型主要有以下幾種:

  • 流式套接字stream (SOCK_STREAM):提供面向連接的、可靠的字節流服務。常用于TCP協議。
  • 數據報套接字dgram (SOCK_DGRAM):提供無連接的、不可靠的數據報服務。常用于UDP協議。

TCPUDP

  • TCP (Transmission Control Protocol):面向連接的、可靠的協議,適用于需要保證數據準確傳輸的場景。
  • UDP (User Datagram Protocol):無連接的、不可靠的協議,適用于需要快速傳輸數據但不要求數據準確到達的場景。

socket服務端核心組件

1.創建socket對象

使用socket.socket()函數可以創建一個 socket對象。該函數的兩個參數分別指定了地址族套接字類型

import socket#創建名為server的一個socket對象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • socket.AF_INET:表示使用IPv4地址。
  • socket.SOCK_STREAM:表示套接字類型流式套接字,即TCP

2.綁定地址端口

服務端需要綁定一個 IP地址端口號,使得客戶端可以找到并連接到服務器

  • 使用對象名.bind()進行綁定,bind()括號中是一個元組類型
#綁定ip地址和服務的端口號
server.bind(("127.0.0.1", 10086))

3.監聽連接

服務器端需要監聽來自客戶端連接請求

  • 使用對象名.listen()函數進行監聽,listen()括號中是一個int類型,表示允許連接的最大連接數
#監聽的最大連接數是3
server.listen(3)

4.接受連接

服務器端使用 對象名.accept() 函數接受客戶端的連接請求

  • 該函數會發生阻塞,直到有客戶端連接
  • 如果有客戶端連接了,accept()返回2個值,第一個是client的socket對象,第二個是client的ip地址和端口
#通過接受到的客戶端連接,來獲取client的socket對象,從而獲取client發送過來的消息
client_sock, client_address = server.accept()
  • client_sock是一個客戶端socket對象
  • client_address是客戶端的地址信息,是一個元組(ip地址, 端口號)

5.接受client端消息client_sock.revc(1024)

  • 使用返回的client_sock對象客戶端進行數據交換。可以使用client_sock.recv()方法接收客戶端發送的數據,
  • recv()能接受的最大字節數1024個字節,所以recv()括號中填寫int類型數字表示字節數,如果接受的字節數大于1024會發生粘包
  • recv()方法在接受數據時會發生阻塞
  • recv()會返回一個編碼后數據,所以我們在查看數據的時候,需要進行data.decode("utf-8")進行解碼
data = client_sock.recv(1024)
print(data.decode("utf-8"))

6.發送響應client端

6.1client_sock.send()

  • 發送時,需要對數據進行編碼,常使用encode("utf-8")對數據進行編碼
  • send()可能會發送數據的全部部分。如果緩沖區已滿網絡狀況不佳,它可能只會發送部分數據
  • send()方法返回一個整數,表示實際發送字節數
response = "收到了"
byte_number = client_sock.send(response.encode("utf-8"))
print(byte_number)  #此時byte_number值為9,因為一個漢字在utf-8中占3個字節

6.2client_sock.sendall()

  • 發送時,需要對數據進行編碼,常使用encode("utf-8")對數據進行編碼
  • 如果由于網絡擁塞其他原因數據不能立即發送完畢sendall()繼續嘗試發送數據,直到所有數據發送完畢
client_sock.sendall("接受到了".encode("utf-8"))

7.關閉client端連接

使用close()函數可以關閉socket連接

client_sock.close()

8.關閉server端連接

使用close()函數可以關閉socket連接

server.close()

socket客戶端核心組件

1.創建socket對象

使用socket.socket()函數可以創建一個 socket對象。該函數的兩個參數分別指定了地址族套接字類型

import socket#創建名為client的一個socket對象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • socket.AF_INET:表示使用IPv4地址。
  • socket.SOCK_STREAM:表示套接字類型流式套接字,即TCP

2.連接server端

  • client端需要使用 client對象.connect()函數連接到服務端
  • connect()括號中是一個元組類型,第一個參數表示服務端ip,第二個參數表示服務端開發的端口
client.connect(("127.0.0.1", 10086))

3.發送請求server端

3.1client.send()

  • 發送時,需要對數據進行編碼,常使用encode("utf-8")對數據進行編碼
  • send()可能會發送數據的全部部分。如果緩沖區已滿網絡狀況不佳,它可能只會發送部分數據
  • send()方法返回一個整數,表示實際發送字節數
request = "你好服務端"
byte_number = client.send(request.encode("utf-8"))
print(byte_number)  #此時byte_number值為15,因為一個漢字在utf-8中占3個字節

3.2client.sendall()

  • 發送時,需要對數據進行編碼,常使用encode("utf-8")對數據進行編碼
  • 如果由于網絡擁塞其他原因數據不能立即發送完畢sendall()繼續嘗試發送數據,直到所有數據發送完畢
client.sendall("你好服務端".encode("utf-8"))

4.接受server端響應client.revc(1024)

  • 使用client對象,可以使用client.recv(1024)方法接收server端響應的數據,
  • recv()能接受的最大字節數1024個字節,所以recv()括號中填寫int類型數字表示字節數,如果接受的字節數大于1024會發生粘包
  • recv()方法在接受數據時會發生阻塞
  • recv()會返回一個編碼后數據,所以我們在查看數據的時候,需要進行data.decode("utf-8")進行解碼
data = client.recv(1024)
print(data.decode("utf-8"))

5.關閉client端連接

使用close()函數可以關閉socket連接

client.close()

示例

server端

import socketclass TCPSERVER:def __init__(self, ip, port):self.ip = ipself.port = portself.number = 5  #設置服務端監聽個數def serverTCP(self):server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #tcpserver.bind((self.ip, self.port))server.listen(self.number)client_sock, client_address = server.accept()while True:try:   #tcp中不允許client先關機,如果先關機,服務端會報錯,所以這里使用try異常捕獲# 接受client消息data = client_sock.recv(1024)print(data.decode("utf-8"))# 響應clientclient_sock.sendall("響應:".encode("utf-8")+data)except ConnectionAbortedError:breakclient_sock.close()server.close()if __name__ == '__main__':s = TCPSERVER("127.0.0.1", 10080)s.serverTCP()

client端

import socketclass TCPCLIENT:def __init__(self, ip, port):self.server_ip = ipself.server_port = portdef clientTCP(self):client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #tcpclient.connect((self.server_ip, self.server_port))while True:msg = input(">>(quit退出):").strip()if not msg:  #tcp不能發送空白消息continueif msg == "quit":break# client端發送數據client.sendall(msg.encode("utf-8"))# client端接受響應data = client.recv(1024)print(data.decode("utf-8"))client.close()if __name__ == '__main__':c = TCPCLIENT("127.0.0.1", 10080)c.clientTCP()

測試

必須先啟動server端,再啟動client端

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

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

相關文章

WPF Telerik.Windows.Controls.Data.PropertyGrid 自定義屬性編輯器

1.AI幫忙定義新用戶控件 2.在屬性上添加TelerikEditorAttribute特性 private ObservableCollection<string> _axisOrder;[Display(Description "點位", GroupName "通用", Name "軸&順序", Order 1)][DataMember][TelerikEditorAt…

【超詳細】別再看零散的教程了!一篇搞定Gitee從注冊、配置到代碼上傳與管理(內含避坑指南最佳實踐)

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、洛谷刷題、C/C基礎知識知識強化補充、C/C干貨分享&學習過程記錄 &#x1f349;學習方向&#xff1a;C/C方向學習者…

43.shell腳本循環與函數

shell腳本循環與函數 for 循環 for 循環用于一次性讀取多個信息&#xff0c;逐一對信息進行操作處理&#xff0c;特別適合處理有范圍的數據 語法 for 變量名 in 取值列表 do命令序列 done批量創建用戶 #!/bin/bashtouch /root/users.txt echo aka blues cloe dio foks > /ro…

模型部署:(四)安卓端部署Yolov8-v8.2.99實例分割項目全流程記錄

模型部署&#xff1a;&#xff08;四&#xff09;安卓端部署Yolov8-v8.2.99實例分割項目全流程記錄1、下載ncnn2、下載opencv-mobile3、文件拷貝4、andorid_studio相關配置5、文件內參數設置5、重構項目&#xff1a;6、打包apk7、部署自己訓練的實例分割模型1、下載ncnn 地址&…

高并發、低延遲全球直播系統架構

一、 核心架構圖 整個系統的數據流和工作流程如下圖所示&#xff0c;它清晰地展示了從主播推流到觀眾觀看的完整過程&#xff1a; #mermaid-svg-QzNpj0DWxd5FERPC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QzN…

AWS strands agents 當智能體作為獨立服務/容器部署時,它們無法共享進程內狀態

當智能體作為獨立服務/容器部署時&#xff0c;它們無法共享進程內狀態。 以下是針對分布式部署中動態內存庫的生產就緒解決方案&#xff1a;1. 基于外部存儲的內存庫基于 DynamoDB 的共享內存import boto3 from strands import Agent, tool from typing import Dict, Any impor…

第五節 JavaScript——引用類型、DOM/BOM 與異步編程

JavaScript 的第五節課通常會深入探討 ??引用類型、DOM 操作、BOM 操作、事件處理以及異步編程?? 等核心概念。這些知識能讓你創建動態交互豐富的網頁。下面我將詳細講解這些內容并提供示例。 ?? JavaScript 第五節:引用類型、DOM/BOM 與異步編程 ? 一、引用類型 引…

使用Pycharm進行遠程ssh(以Featurize為例)

使用Pycharm進行遠程ssh&#xff08;以Featurize為例&#xff09;文章目錄介紹應用背景遠程連接Python連接Jupyter介紹應用背景 在使用Pycharm 專業版的時候進行遠程ssh連接服務器&#xff08;Featurize&#xff09;的Python解釋器和Jupyter 遠程連接Python 打開Pycharm點擊…

深入研究:ClickHouse中arrayExists與hasAny在ORDER BY場景下的性能差異

最近公司大數據情況下ClickHouse查詢性能極差&#xff0c;后來發現在大數據量ORDER BY場景下&#xff0c;arrayExists(x -> x in ...)比hasAny性能快10倍&#xff01;&#xff01;&#xff01;&#xff01; 一、問題重述與研究背景 在大數據量 ORDER BY場景下&#xff0c;…

Spring AI (二)結合Mysql做聊天信息存儲

上文講了&#xff0c;用Spring ai做簡單的聊天功能&#xff0c;沒看過的可以查看下 Spring AI結合豆包模型 這里簡單結合下Jdbc做下聊天記錄的存儲和查詢&#xff0c;讓對話變的更智能。 首先是Pom的支持 <dependency><groupId>org.springframework.ai</grou…

【docker】data-root 數據遷移(防止無法加載鏡像和容器問題)

操作系統&#xff1a;ubuntu 24.04 docker版本&#xff1a;docker-ce 28.1.1 目標&#xff1a;將/var/lib/docker 的數據遷移到/data/docker停止docker sudo systemctl stop docker.socket sudo systemctl stop docker這個步驟一定要做&#xff0c;否則容易導致數據不一致。 rs…

二、網頁的“化妝師”:從零學習 CSS

一、CSS 是什么 1.1 CSS 的定義 CSS&#xff08;Cascading Style Sheets&#xff0c;層疊樣式表&#xff09; 是一種用來給 HTML 頁面 添加樣式的語言。 簡單來說&#xff1a; HTML 負責結構 —— 決定網頁上有什么內容。 CSS 負責樣式 —— 決定這些內容“長什么樣”。 如果…

傳統項目管理與敏捷的核心差異

在項目管理領域&#xff0c;傳統方法與敏捷方法代表了兩種不同的管理思維與實踐路徑。傳統項目管理強調計劃性、規范性和階段性推進&#xff0c;而敏捷則注重靈活性、快速迭代和價值交付。 正如彼得德魯克所說&#xff1a;“沒有完美的計劃&#xff0c;只有不斷調整的行動。”理…

axios+ts封裝

http.ts import axios from axios import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from axios import qs from qs/*** 擴展AxiosRequestConfig&#xff0c;增加一些自定義的屬性* isAuth: 自定義的參數中&#xff0c;用來判斷是否攜帶token 因為AxiosReq…

2026新選題:基于K-Means實現學生求職意向聚類推薦職位

作者簡介&#xff1a;Java領域優質創作者、CSDN博客專家 、CSDN內容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構師設計經驗、多年校企合作經驗&#xff0c;被多個學校常年聘為校外企業導師&#xff0c;指導學生畢業設計并參與學生畢業答辯指導&#xff0c;…

SpringCloud gateway配置predicates的匹配規則

需求 通過gateway的route規則&#xff0c;實現分組流量配置 資源 一個nacos&#xff0c;一個gateway &#xff0c;一個服務app&#xff08;部署雙實例group-1&#xff0c;group-2&#xff09;&#xff0c;實現特定條件下往分組一和分組二流量切換。 方案 1 配置文件 nacos…

android14 硬鍵盤ESC改BACK按鍵返回無效問題

在之前的android版本中修改外接鍵盤ESC為BACK按鍵做返回鍵使用&#xff0c;直接修改如下代碼即可&#xff1a;--- a/frameworks/base/data/keyboards/Generic.kcmb/frameworks/base/data/keyboards/Generic.kcm-499,7 499,7 key PLUS {### Non-printing keys ###key ESCAPE { …

【開題答辯全過程】以 asp高校外賣訂單系統的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

UVa1063/LA3807 The Rotation Game

UVa1063/LA3807 The Rotation Game題目鏈接題意輸入格式輸出格式分析AC 代碼IDA*分3次BFS題目鏈接 本題是2004年icpc亞洲區域賽上海賽區的H題 題意 如下圖所示形狀的棋盤上分別有8個1、2、3&#xff0c;要往A&#xff5e;H方向旋轉棋盤&#xff0c;使中間8個方格數字相同。圖&…

用pywin32連接autocad 寫一個利用遺傳算法從選擇的閉合圖形內進行最優利用率的排版 ai草稿

好的&#xff0c;我們來深入細說遺傳算法&#xff08;Genetic Algorithm, GA&#xff09;在鈑金自動排版中的應用。遺傳算法 (GA) 在鈑金排版中的詳細解析遺傳算法是一種受達爾文生物進化論啟發的元啟發式優化算法。它不追求一次性找到數學上的絕對最優解&#xff0c;而是通過模…