最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中socket(套接字)庫詳細(xì)舉例解析

 更新時(shí)間:2025年08月11日 09:01:10   作者:橙色小博  
Socket又稱套接字,應(yīng)用程序通常通過套接字向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求,使主機(jī)間或者一臺(tái)計(jì)算機(jī)上的進(jìn)程間可以通訊,這篇文章主要介紹了python中socket(套接字)庫的相關(guān)資料,需要的朋友可以參考下

1. 前言

在 Python 開發(fā)中,socket 庫是一個(gè)非常重要的工具,它允許我們進(jìn)行網(wǎng)絡(luò)編程。通過 socket,程序可以在不同的機(jī)器之間進(jìn)行通信,這為我們構(gòu)建分布式系統(tǒng)、網(wǎng)絡(luò)服務(wù)等提供了基礎(chǔ)。無論是開發(fā)一個(gè)簡單的聊天程序,還是構(gòu)建復(fù)雜的網(wǎng)絡(luò)服務(wù)架構(gòu),socket 都是不可或缺的。本文將結(jié)合詳細(xì)的 Python 代碼,全面介紹 socket 庫的使用方法,讓你輕松掌握網(wǎng)絡(luò)編程的核心技能。

2. socket 庫基礎(chǔ)

2.1 什么是 socket?

socket(套接字)是通信的端點(diǎn),它是一個(gè)通信會(huì)話的抽象。在計(jì)算機(jī)網(wǎng)絡(luò)中,兩臺(tái)計(jì)算機(jī)之間要進(jìn)行通信,就需要在雙方建立 socket 連接,通過這個(gè)雙向通道進(jìn)行數(shù)據(jù)的發(fā)送和接收。

2.2 socket 的類型

主要有兩種常見的 socket 類型:

  • SOCK_STREAM :提供面向連接的、可靠的字節(jié)流服務(wù),基于 TCP 協(xié)議。它確保數(shù)據(jù)按照順序到達(dá),并且在數(shù)據(jù)傳輸過程中不會(huì)出現(xiàn)重復(fù)。

  • SOCK_DGRAM :提供無連接的、不可靠的 datagram 服務(wù),基于 UDP 協(xié)議。這種類型的數(shù)據(jù)傳輸不保證可靠性,數(shù)據(jù)可能會(huì)丟失或亂序到達(dá),但它的傳輸速度相對較快,適用于對實(shí)時(shí)性要求較高但對數(shù)據(jù)丟失不太敏感的場景,如視頻流傳輸。

3. 基于 TCP 的 socket 編程

3.1 TCP 服務(wù)器端代碼示例

import socket

# 創(chuàng)建 socket 對象,AF_INET 表示使用 IPv4 地址,SOCK_STREAM 表示使用 TCP 協(xié)議
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 綁定 IP 地址和端口,這里綁定本地主機(jī)的 8080 端口
server_socket.bind(("localhost", 8080))

# 開始監(jiān)聽,監(jiān)聽隊(duì)列長度為 5
server_socket.listen(5)
print("服務(wù)器開始監(jiān)聽...")

# 接受客戶端連接,accept() 方法會(huì)阻塞等待客戶端連接
client_socket, client_address = server_socket.accept()
print(f"客戶端 {client_address} 已連接")

# 接收客戶端發(fā)送的數(shù)據(jù),1024 表示緩沖區(qū)大小
data = client_socket.recv(1024).decode()
print(f"接收到客戶端消息:{data}")

# 向客戶端發(fā)送數(shù)據(jù)
response = "服務(wù)器已收到消息"
client_socket.send(response.encode())

# 關(guān)閉連接
client_socket.close()
server_socket.close()

3.2 TCP 客戶端代碼示例

import socket

# 創(chuàng)建 socket 對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 連接到服務(wù)器,這里連接本地主機(jī)的 8080 端口
client_socket.connect(("localhost", 8080))

# 向服務(wù)器發(fā)送數(shù)據(jù)
message = "Hello, Server!"
client_socket.send(message.encode())

# 接收服務(wù)器返回的數(shù)據(jù)
response = client_socket.recv(1024).decode()
print(f"收到服務(wù)器回復(fù):{response}")

# 關(guān)閉連接
client_socket.close()

3.3 代碼分析

  • 在服務(wù)器端,bind() 方法用于綁定 IP 地址和端口,使得服務(wù)器能夠監(jiān)聽指定地址和端口上的連接請求。listen() 方法則讓服務(wù)器進(jìn)入監(jiān)聽狀態(tài),等待客戶端的連接。

  • accept() 方法是一個(gè)阻塞方法,它會(huì)等待客戶端的連接。當(dāng)客戶端連接成功后,會(huì)返回一個(gè)新的 socket 對象(用于和客戶端進(jìn)行通信)和客戶端的地址信息。

  • 客戶端通過 connect() 方法連接到服務(wù)器的指定 IP 地址和端口。

  • 數(shù)據(jù)的發(fā)送和接收分別通過 send()recv() 方法實(shí)現(xiàn),需要注意數(shù)據(jù)是以字節(jié)流的形式傳輸,所以在發(fā)送之前要使用 encode() 方法將字符串編碼為字節(jié),接收后使用 decode() 方法解碼為字符串。

4. 基于 UDP 的 socket 編程

4.1 UDP 服務(wù)器端代碼示例

import socket

# 創(chuàng)建 socket 對象,SOCK_DGRAM 表示使用 UDP 協(xié)議
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 綁定 IP 地址和端口
server_socket.bind(("localhost", 9090))
print("UDP 服務(wù)器啟動(dòng),等待客戶端消息...")

while True:
    # 接收客戶端發(fā)送的數(shù)據(jù)和客戶端地址
    data, client_address = server_socket.recvfrom(1024)
    print(f"收到客戶端 {client_address} 的消息:{data.decode()}")

    # 向客戶端發(fā)送數(shù)據(jù)
    response = "服務(wù)器已收到你的 UDP 消息"
    server_socket.sendto(response.encode(), client_address)

    # 如果收到特定消息就退出循環(huán)
    if data.decode() == "exit":
        break

# 關(guān)閉 socket
server_socket.close()

4.2 UDP 客戶端代碼示例

import socket

# 創(chuàng)建 socket 對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 向服務(wù)器發(fā)送數(shù)據(jù)
server_address = ("localhost", 9090)
message = "Hello, UDP Server!"
client_socket.sendto(message.encode(), server_address)

# 接收服務(wù)器返回的數(shù)據(jù)
response, server_address = client_socket.recvfrom(1024)
print(f"收到服務(wù)器 {server_address} 的回復(fù):{response.decode()}")

# 再次發(fā)送消息并接收回復(fù)(測試多輪通信)
message = "This is another message"
client_socket.sendto(message.encode(), server_address)
response, server_address = client_socket.recvfrom(1024)
print(f"收到服務(wù)器回復(fù):{response.decode()}")

# 發(fā)送退出消息
client_socket.sendto("exit".encode(), server_address)

# 關(guān)閉連接
client_socket.close()

4.3 代碼分析

  • UDP 是無連接的,所以在服務(wù)器端不需要像 TCP 一樣調(diào)用 listen()accept() 方法來建立連接,而是直接通過 recvfrom() 方法接收數(shù)據(jù)和客戶端地址。

  • 客戶端通過 sendto() 方法發(fā)送數(shù)據(jù),同時(shí)指定目標(biāo)服務(wù)器的地址和端口。recvfrom() 方法用于接收數(shù)據(jù)和服務(wù)器的地址。

  • UDP 的這種通信方式使得數(shù)據(jù)的發(fā)送和接收相對簡單,但需要注意數(shù)據(jù)的丟失和亂序問題。

5. 總結(jié)

Python 中的 socket 庫是強(qiáng)大而靈活的網(wǎng)絡(luò)編程工具。通過本文的介紹和代碼示例,我們詳細(xì)了解了基于 TCP 和 UDP 協(xié)議的 socket 編程方法。TCP 提供了可靠的面向連接的通信,適用于對數(shù)據(jù)準(zhǔn)確性要求高的場景;UDP 則提供了簡單的無連接通信,適合對實(shí)時(shí)性要求較高但對數(shù)據(jù)丟失不太敏感的場景。在實(shí)際開發(fā)中,我們可以根據(jù)具體需求選擇合適的協(xié)議類型來構(gòu)建網(wǎng)絡(luò)應(yīng)用,從簡單的客戶端 - 服務(wù)器架構(gòu)到復(fù)雜的分布式系統(tǒng),socket 庫都能為我們提供堅(jiān)實(shí)的基礎(chǔ)。掌握 socket 編程,將為你打開網(wǎng)絡(luò)編程世界的大門,讓你能夠開發(fā)出各種具有網(wǎng)絡(luò)通信功能的應(yīng)用程序。

到此這篇關(guān)于python中socket(套接字)庫的文章就介紹到這了,更多相關(guān)python中socket套接字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中深淺拷貝的區(qū)別詳細(xì)分析

    Python中深淺拷貝的區(qū)別詳細(xì)分析

    深拷貝和淺拷貝都是對原對象的拷貝,都會(huì)生成一個(gè)看起來相同的對象,下面這篇文章主要給大家介紹了關(guān)于Python中深淺拷貝的區(qū)別的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • ?分享4款Python 自動(dòng)數(shù)據(jù)分析神器

    ?分享4款Python 自動(dòng)數(shù)據(jù)分析神器

    這篇文章主要給大家分享的是4款Python 自動(dòng)數(shù)據(jù)分析神器,我給大家分享 4 款常用的EDA工具,它們可以自動(dòng)產(chǎn)出統(tǒng)計(jì)數(shù)據(jù)和圖表,為我們節(jié)省大量時(shí)間,需要的朋友可以參考一下
    2022-03-03
  • python3中利用filter函數(shù)輸出小于某個(gè)數(shù)的所有回文數(shù)實(shí)例

    python3中利用filter函數(shù)輸出小于某個(gè)數(shù)的所有回文數(shù)實(shí)例

    今天小編就為大家分享一篇 python3中利用filter函數(shù)輸出小于某個(gè)數(shù)的所有回文數(shù)實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python中sub-pub機(jī)制實(shí)現(xiàn)Redis的訂閱與發(fā)布

    python中sub-pub機(jī)制實(shí)現(xiàn)Redis的訂閱與發(fā)布

    本文主要介紹了python中sub-pub機(jī)制實(shí)現(xiàn)Redis的訂閱與發(fā)布,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Numpy中的ravel_multi_index函數(shù)用法說明

    Numpy中的ravel_multi_index函數(shù)用法說明

    這篇文章主要介紹了Numpy中的ravel_multi_index函數(shù)用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Python使用百度api做人臉對比的方法

    Python使用百度api做人臉對比的方法

    今天小編就為大家分享一篇Python使用百度api做人臉對比的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python 自由定制表格的實(shí)現(xiàn)示例

    Python 自由定制表格的實(shí)現(xiàn)示例

    這篇文章主要介紹了Python 自由定制表格的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python打包成exe(windows)或者app(mac)實(shí)踐

    Python打包成exe(windows)或者app(mac)實(shí)踐

    文章主要介紹了使用pyinstaller將Python腳本打包成可執(zhí)行文件的步驟,包括在Windows和macOS上的操作方法,詳細(xì)解釋了命令參數(shù)的作用和使用方法
    2026-04-04
  • 深入探究PyTorch核心特性之自動(dòng)求導(dǎo)和優(yōu)化

    深入探究PyTorch核心特性之自動(dòng)求導(dǎo)和優(yōu)化

    在你已經(jīng)掌握了如何使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)上,接下來我們將深入探討PyTorch的兩個(gè)核心特性:自動(dòng)求導(dǎo)(Autograd)和優(yōu)化(Optimization),這兩個(gè)特性在深度學(xué)習(xí)模型的訓(xùn)練過程中起著至關(guān)重要的作用,感興趣的同學(xué)一起來看看吧
    2023-07-07
  • 基于Python實(shí)現(xiàn)一個(gè)自動(dòng)關(guān)機(jī)程序并打包成exe文件

    基于Python實(shí)現(xiàn)一個(gè)自動(dòng)關(guān)機(jī)程序并打包成exe文件

    這篇文章主要介紹了通過Python創(chuàng)建一個(gè)可以自動(dòng)關(guān)機(jī)的小程序,并打包成exe文件。文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,感興趣的同學(xué)可以了解一下
    2021-12-12

最新評論

调兵山市| 华亭县| 布拖县| 安新县| 贵港市| 拉萨市| 张家川| 沁源县| 竹北市| 高阳县| 林周县| 孝感市| 邳州市| 鄂尔多斯市| 深州市| 林周县| 岱山县| 横山县| 江安县| 海伦市| 屏边| 宕昌县| 定结县| 乐昌市| 阜平县| 瓮安县| 沁阳市| 商洛市| 抚州市| 安国市| 盱眙县| 日土县| 宣武区| 绥化市| 资阳市| 彭州市| 聂荣县| 达尔| 乐清市| 永仁县| 吴桥县|