【Python Web開發】02-Socket網絡編程02

文章目錄

    • 1. 服務器端
      • 1.1 socket.socket()
      • 1.2 socket.bind()
      • 1.3 socket.listen()
      • 1.4 socket.accept()
      • 1.5 socket.recv()
      • 1.6 socket.send() 和 socket.sendall()
      • 1.7 socket.close()
    • 2. 客戶端
      • 2.1 socket.socket()
      • 2.2 socket.connect()
      • 2.3 socket.send() 和 socket.sendall()
      • 2.4 socket.recv()
      • 2.5 socket.close()
      • 2.6 UDP 客戶端方法的差異

這里主要是介紹一下Socket通訊中服務端和客戶端需要使用的方法及其說明

1. 服務器端

在 Python 網絡編程里,服務器端通常會使用 socket 模塊中的多個方法來實現網絡通信。

下面為你詳細介紹服務器端常用的方法及其用法。

1.1 socket.socket()

  • 功能:創建一個套接字對象。套接字是網絡編程的基礎,它就像是一個通信的端點,通過它可以進行數的發送和接受

  • 語法

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
  • 參數說明
    • family:指定地址族,常用的有 socket.AF_INET(表示 IPv4 地址)和 socket.AF_INET6(表示 IPv6 地址)。
    • type:指定套接字類型,常用的有 socket.SOCK_STREAM(表示 TCP 套接字)和 socket.SOCK_DGRAM(表示 UDP 套接字)。
    • proto:通常取默認值 0。
    • fileno:通常取默認值 None。

示例

import socket# 創建一個TCP/IPv4套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

1.2 socket.bind()

  • 功能:將套接字綁定到指定的IP地址和端口號。這樣客戶端就可以通過這個地址和端口找到服務器。

  • 語法

socket.bind(address)
  • 參數說明

    • address:是一個元組,格式為 (host, port),其中 host 是 IP 地址,port 是端口號。

示例:

# 服務器地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)

1.3 socket.listen()

  • 功能:讓套接字進入監聽狀態,開始等待客戶端的連接請求
  • 語法
socket.listen(backlog)
  • 參數說明
    • backlog:指定允許排隊等待處理的最大連接請求數量

示例

# 開始監聽,允許最多5個連接請求排隊等待
server_socket.listen(5)
print('服務器正在監聽端口 8888...')

1.4 socket.accept()

  • 功能:接受客戶端的請求,并返回一個新的套接字對象和客戶端地址。新的套接字對象用于與客戶端進行數據通信。
  • 語法
conn, addr = socket.accept()
  • 返回值說明
    • coon:是一個新的套接字對象,用于與客戶端進行數據收發。
    • addr:是客戶端的地址信息,通常是一個元組(host,port)

示例

while True:# 接受客戶端連接connection, client_address = server_socket.accept()print(f'連接來自: {client_address}')

1.5 socket.recv()

  • 功能:從客戶端接收數據
  • 語法
data = socket.recv(bufsize)
  • 參數說明
    • bufsize:指定一次最多接收的字節數

示例

# 接收客戶端發送的數據
data = connection.recv(1024)
print(f'收到的數據: {data.decode()}')

1.6 socket.send() 和 socket.sendall()

  • 功能:向客戶端發送數據。send方法嘗試發送數據,但可能不會發送完所有的數據;sendall方法會確保所有數據都被發送出去

  • 語法

# send方法
sent = socket.send(data)
# sendall方法
socket.sendall(data)
  • 參數說明
    • data:要發送的數據,必須是字節類型

示例

# 發送響應給客戶端
message = '你好,客戶端!'
connection.sendall(message.encode())

1.7 socket.close()

  • 功能:關閉套接字,釋放相關資源
  • 語法
socket.close()

示例

# 關閉連接
connection.close()

完整示例
以下是一個完整的 TCP 服務器端示例代碼,展示了上述方法的綜合使用:

import socket# 創建一個TCP/IPv4套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 服務器地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)# 開始監聽,允許最多5個連接請求排隊等待
server_socket.listen(5)
print('服務器正在監聽端口 8888...')while True:# 接受客戶端連接connection, client_address = server_socket.accept()try:print(f'連接來自: {client_address}')# 接收客戶端發送的數據data = connection.recv(1024)print(f'收到的數據: {data.decode()}')# 發送響應給客戶端message = '你好,客戶端!'connection.sendall(message.encode())finally:# 關閉連接connection.close()

通過上述方法的使用,可以實現一個簡單的 TCP 服務器端,處理客戶端的連接請求和數據通信。

如果使用 UDP 協議,部分方法會有所不同,例如不需要 listen 和 accept 方法,而是直接使用 recvfrom 和 sendto 方法進行數據的收發。

2. 客戶端

在 Python 網絡編程里,客戶端也會用到 socket 模塊中的多個方法來和服務器進行通信。

下面詳細介紹客戶端常用的方法及其用法。

2.1 socket.socket()

  • 功能:創建一個套接字對象,這是網絡通信的基礎,客戶端借助它來發送和接收數據。
  • 語法
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
  • 參數說明
    • family:指定地址族,常見的有 socket.AF_INET(代表 IPv4 地址)和 socket.AF_INET6(代表 IPv6 地址)。
    • type:指定套接字類型,常用的是 socket.SOCK_STREAM(表示 TCP 套接字)和 socket.SOCK_DGRAM(表示 UDP 套接字)。
    • proto:一般取默認值 0。
    • fileno:通常取默認值 None。

示例

import socket# 創建一個TCP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2.2 socket.connect()

  • 功能:客戶端使用此方法向服務器發起連接請求。若服務器接受請求,雙方就會建立起連接。
  • 語法
socket.connect(address)
  • 參數說明
    • address:是一個元組,格式為 (host, port),host 是服務器的 IP 地址,port 是服務器監聽的端口號

示例

# 服務器地址和端口
server_address = ('localhost', 8888)
client_socket.connect(server_address)

2.3 socket.send() 和 socket.sendall()

  • 功能:向服務器發送數據。send 方法嘗試發送數據,但也許不會發送完所有數據;sendall 方法會保證所有數據都被發送出去。
  • 語法
# send方法
sent = socket.send(data)
# sendall方法
socket.sendall(data)
  • 參數說明
    • data:要發送的數據,必須是字節類型。

示例

# 發送數據給服務器
message = '你好,服務器!'
client_socket.sendall(message.encode())

2.4 socket.recv()

  • 功能:從服務器接收數據。
  • 語法
data = socket.recv(bufsize)
  • 參數說明
    • bufsize:指定一次最多接收的字節數。

示例

# 接收服務器的響應
data = client_socket.recv(1024)
print(f'收到服務器的響應: {data.decode()}')

2.5 socket.close()

  • 功能:關閉套接字,釋放相關資源。
  • 語法
socket.close()

示例

# 關閉連接
client_socket.close()

完整示例代碼
下面是一個完整的 TCP 客戶端示例代碼,展示了上述方法的綜合運用:

import socket# 創建一個TCP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 服務器地址和端口
server_address = ('localhost', 8888)# 連接服務器
client_socket.connect(server_address)try:# 發送數據給服務器message = '你好,服務器!'client_socket.sendall(message.encode())# 接收服務器的響應data = client_socket.recv(1024)print(f'收到服務器的響應: {data.decode()}')
finally:# 關閉連接client_socket.close()

2.6 UDP 客戶端方法的差異

若使用 UDP 協議,客戶端不需要 connect 方法來建立連接,而是直接使用 sendto 和 recvfrom 方法進行數據的收發。下面是一個簡單的 UDP 客戶端示例:

import socket# 創建一個UDP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 服務器地址和端口
server_address = ('localhost', 9999)# 發送數據給服務器
message = '你好,服務器!'
client_socket.sendto(message.encode(), server_address)# 接收服務器的響應
data, server = client_socket.recvfrom(1024)
print(f'收到服務器的響應: {data.decode()}')# 關閉套接字
client_socket.close()

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

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

相關文章

Flutter 在全新 Platform 和 UI 線程合并后,出現了什么大坑和變化?

Flutter 在全新 Platform 和 UI 線程合并后,出現了什么大坑和變化? 在兩個月前,我們就聊過 3.29 上《Platform 和 UI 線程合并》的具體原因和實現方式,而事實上 Platform 和 UI 線程合并,確實為后續原生語言和 Dart 的…

藍橋杯 1. 四平方和

四平方和 原題目鏈接 題目描述 四平方和定理(又稱拉格朗日定理)指出: 每個正整數都可以表示為 至多 4 個正整數的平方和。 如果將 0 包括進去,則每個正整數都可以恰好表示為 4 個非負整數的平方和。 例如: 5 0 …

開發并發布一個屬于自己的包(npm)

一、CommonJS規范導入require 創建一個npm包涉及幾個步驟,包括設置你的項目結構、編寫代碼、編寫文檔、測試你的代碼,以及發布到npm倉庫。以下是一個基本的指南,幫助你從頭開始創建一個npm包。 步驟 1: 初始化npm項目 創建項目文件夾&#x…

CRTP(Curiously Recurring Template Pattern)

C 中的 CRTP(奇異遞歸模板模式) CRTP(Curiously Recurring Template Pattern)是一種利用模板繼承實現 靜態多態(Static Polymorphism) 的設計模式。通過基類模板以派生類作為模板參數,CRTP 允許…

小白工具視頻轉MPG, 功能豐富齊全,無需下載軟件,在線使用,超實用

在視頻格式轉換需求日益多樣的今天,小白工具網的在線視頻轉 MPG 功能https://www.xiaobaitool.net/videos/convert-to-mpg/ )脫穎而出,憑借其出色特性,成為眾多用戶處理視頻格式轉換的優質選擇。 從格式兼容性來看,它支…

銀河麒麟系統離線安裝nodejs

本篇文章我們介紹如何通過nvm(node版本管理工具)來實現離線安裝nodejs 第一步:下載nvm https://github.com/nvm-sh/nvm/releases/tag/v0.40.1 在頁面找到【Source code(tar.gz)】下載 第二步:安裝nvm 將下載好的tar.gz拷貝到銀河麒麟系統文件夾下(加…

Go語言中包導入下劃線的作用解析

在Go語言的代碼中,有時會看到類似以下的導入語句: import _ "github.com/mattn/go-sqlite3"這種以下劃線_開頭的導入方式,顯得有些特別,尤其是對于新手來說,可能會感到困惑,為什么要這樣寫&…

Winddows11官網下載安裝VMware Workstation Pro17(圖文詳解)

Winddows11安裝VMware17 1、官網下載2、安裝3、總結 1、官網下載 官網地址 點擊Products,滑到最下面,選擇SEE DESKTOPP HYPERVISORS 選擇 DOWNLOAD FUSION OR WORKSTATION 自動跳轉到下面哪個服界面,注冊 輸入郵箱地址和圖片下面的文字…

DeepSeek智能時空數據分析(二):3秒對話式搞定“等時圈”繪制

序言:時空數據分析很有用,但是GIS/時空數據庫技術門檻太高 時空數據分析在優化業務運營中至關重要,然而,三大挑戰仍制約其發展:技術門檻高,需融合GIS理論、SQL開發與時空數據庫等多領域知識;空…

【Linux網絡】應用層自定義協議與序列化及Socket模擬封裝

📢博客主頁:https://blog.csdn.net/2301_779549673 📢博客倉庫:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正! &…

基于大模型的結腸癌全病程預測與診療方案研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 二、結腸癌概述 2.1 流行病學特征 2.2 發病機制與危險因素 2.3 臨床癥狀與診斷方法 三、大模型技術原理與應用現狀 3.1 大模型的基本原理 3.2 在醫療領域的應用情況 3.3 在結腸癌預測中的潛力分析 四、術前…

【UML建模】starUML工具

一.概述 StarUML是一款UML工具,允許用戶創建和管理UML(統一建模語言)模型,廣泛應用于軟件工程領域。它的主要功能包括創建各種UML圖:如用例圖、類圖、序列圖等,支持代碼生成與反向工程,以及提供…

模板元編程(Template Metaprogramming, TMP)

C 模板元編程(Template Metaprogramming, TMP) 模板元編程是一種利用 C 模板系統在 編譯期間 完成計算、類型操作和代碼生成的編程范式。其核心優勢在于通過 零運行時開銷 實現高效、類型安全的代碼。以下是模板元編程的詳細分步解析。 1. 編譯時計算 …

Android Build Variants(構建變體)詳解

Android Build Variants(構建變體)是 Android 開發中用于生成不同版本應用程序的一種機制。它允許開發者根據不同的需求,如不同的應用市場、不同的功能模塊、不同的環境配置等,從同一個代碼庫中生成多個不同的 APK。 組成部分 B…

26考研|數學分析:數項級數

數項級數這一章的開始,開啟了新的關于“級數”這一新的概念體系的學習進程,此部分共包含四章的內容,分別為數項級數、函數項級數、冪級數以及傅里葉級數。這一章中,首先要掌握級數的相關概念與定義,重難點在于掌握判斷…

擁抱健康生活,解鎖養生之道

在生活節奏日益加快的當下,健康養生已成為人們關注的焦點。科學的養生方法,能幫助我們增強體質、預防疾病,以更飽滿的精神狀態擁抱生活。 合理飲食是養生的基石。《黃帝內經》中提到 “五谷為養,五果為助,五畜為益&…

房地產安裝工程師簡歷模板

模板信息 簡歷范文名稱:房地產安裝工程師簡歷模板,所屬行業:其他 | 職位,模板編號:XUCP9X 專業的個人簡歷模板,邏輯清晰,排版簡潔美觀,讓你的個人簡歷顯得更專業,找到好…

HTML5 詳細學習筆記

1. HTML5 簡介 HTML5 是最新的 HTML 標準&#xff0c;于 2014 年 10 月由 W3C 完成標準制定。它增加了許多新特性&#xff0c;包括語義化標簽、多媒體支持、圖形效果、離線存儲等。 1.1 HTML5 文檔基本結構 <!DOCTYPE html> <html lang"zh-CN"> <h…

【網絡入侵檢測】基于Suricata源碼分析NFQ IPS模式實現

【作者主頁】只道當時是尋常 【專欄介紹】Suricata入侵檢測。專注網絡、主機安全,歡迎關注與評論。 1. 概要 ?? 本文聚焦于 Suricata 7.0.10 版本源碼,深入剖析其 NFQ(Netfilter Queue)模式的實現原理。通過系統性拆解初始化階段的配置流程、數據包監聽機制的構建邏輯,以…

C語言結構體和union內存對齊

在C語言的世界里&#xff0c;結構體&#xff08;struct&#xff09;和聯合體&#xff08;union&#xff09;的內存布局一直是困擾許多開發者的難題。當我們定義一個結構體時&#xff0c;編譯器會按照特定的規則為每個成員分配內存空間&#xff0c;這些規則被稱為內存對齊。看似…