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

一文詳解Python中socket庫的完整使用教程

 更新時間:2026年06月29日 08:23:02   作者:detayun  
Socket?又稱套接字,是應用程序與網(wǎng)絡傳輸層之間的接口,所有網(wǎng)絡通信都基于?Socket,本文詳細介紹了Python的socket模塊,涵蓋TCP和UDP協(xié)議的基本概念、常用API方法、高頻配置選項及常見問題,有需要的可以了解下

一、socket 簡介

Socket 又稱套接字,是應用程序與網(wǎng)絡傳輸層之間的接口,所有網(wǎng)絡通信都基于 Socket。

Python 內(nèi)置 socket 模塊,無需額外安裝,可以直接完成 TCP、UDP 通信。

網(wǎng)絡兩大傳輸協(xié)議:

  1. TCP(SOCK_STREAM):面向連接、可靠、三次握手,不會丟包。
  2. UDP(SOCK_DGRAM):無連接、不可靠,直接發(fā)送數(shù)據(jù)包,速度更快。

導入模塊:

import socket

二、socket 對象創(chuàng)建

語法

socket.socket(family, type)
  • family=socket.AF_INET:IPv4(最常用)
  • type=socket.SOCK_STREAM:TCP
  • type=socket.SOCK_DGRAM:UDP

示例:

# 創(chuàng)建TCP套接字
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 創(chuàng)建UDP套接字
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

第一部分:TCP 通信全套API

TCP通信分為客戶端和服務端。

1. TCP 客戶端常用方法

方法作用
connect((host, port))和服務端建立TCP連接
send(bytes)發(fā)送字節(jié)數(shù)據(jù)
recv(buffer_size)接收數(shù)據(jù),返回bytes
settimeout(n)設置阻塞超時時間
close()關閉套接字

完整客戶端代碼

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)  # 5秒無響應則超時

# 建立連接
sock.connect(("127.0.0.1", 8080))

# 發(fā)送數(shù)據(jù),只能發(fā)送bytes
sock.send("你好服務端".encode("utf-8"))

# 接收數(shù)據(jù),最多讀取1024字節(jié)
data = sock.recv(1024)
print(data.decode("utf-8"))

sock.close()

2. TCP 服務端常用方法

方法作用
bind((ip, port))綁定本機IP與端口
listen(n)開啟監(jiān)聽,n為等待隊列長度
accept()阻塞等待客戶端接入,返回(conn, address)

完整服務端代碼

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 端口復用,避免重啟時報端口被占用
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

server.bind(("0.0.0.0", 8080))
server.listen(5)
print("服務端已啟動,等待連接...")

# 阻塞等待客戶端
conn, client_addr = server.accept()
print("客戶端地址:", client_addr)

# 接收消息
msg = conn.recv(1024)
print("收到:", msg.decode())

# 回復消息
conn.send("收到消息".encode("utf-8"))

# 關閉當前客戶端連接
conn.close()

第二部分:UDP 通信全套API

UDP 不需要建立連接,沒有 connect(可選),核心方法只有兩個:

方法作用
sendto(data, (ip, port))發(fā)送數(shù)據(jù)并指定目標地址
recvfrom(buffer)接收數(shù)據(jù),同時獲取發(fā)送方地址

1. UDP客戶端(只發(fā)數(shù)據(jù))

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 發(fā)送UDP數(shù)據(jù)包
sock.sendto(b"心跳包", ("127.0.0.1", 9999))
sock.close()

2. UDP服務端接收數(shù)據(jù)

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", 9999))

while True:
    data, addr = sock.recvfrom(1024)
    print(f"來自{addr}: {data.decode()}")
    # 回包
    sock.sendto(b"ok", addr)

3. UDP廣播設置

局域網(wǎng)設備發(fā)現(xiàn)必備:

# 開啟廣播權限
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(b"online", ("255.255.255.255", 9999))

三、socket 高頻通用配置選項

1. 端口復用(必加)

解決服務端重啟提示 Address already in use

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

2. 設置阻塞超時

recv、accept 默認永久阻塞,必須加超時防止程序卡死

sock.settimeout(3)

捕獲異常:

try:
    data = sock.recv(1024)
except socket.timeout:
    print("接收超時")

3. 關閉Nagle算法,小包立即發(fā)送

sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)

4. 獲取本機IP

socket.gethostbyname(socket.gethostname())

5. 域名解析為IP

socket.gethostbyname("www.baidu.com")

四、TCP 經(jīng)典問題:粘包問題

TCP是字節(jié)流,沒有數(shù)據(jù)包邊界,多次發(fā)送的數(shù)據(jù)會粘在一起。

解決方案:

  1. 固定每條消息長度;
  2. 先發(fā)送數(shù)據(jù)長度,再發(fā)送正文;
  3. 使用換行符、特殊字符做分隔。

簡單分隔示例:

# 發(fā)送端
sock.send(b"hello|||")
# 接收端按分隔符切割數(shù)據(jù)

五、常用實戰(zhàn)小案例

案例1:TCP端口存活檢測

def port_check(host, port, timeout=2):
    try:
        sock = socket.socket()
        sock.settimeout(timeout)
        sock.connect((host, port))
        sock.close()
        return True
    except:
        return False

案例2:裸Socket發(fā)送HTTP請求(不使用requests)

sock = socket.socket()
sock.connect(("www.baidu.com", 80))
http_header = b"GET / HTTP/1.1\r\nHost:www.baidu.com\r\nConnection:close\r\n\r\n"
sock.send(http_header)
print(sock.recv(4096).decode("utf-8", errors="ignore"))
sock.close()

六、核心方法匯總表

TCP專用

  • connect()
  • listen()
  • bind()
  • accept()
  • send()
  • recv()

UDP專用

  • sendto()
  • recvfrom()

公共方法

  • settimeout()
  • setsockopt()
  • close()

七、避坑總結(jié)

  1. 所有收發(fā)數(shù)據(jù)必須是 bytes,字符串必須 .encode("utf-8");
  2. TCP必須先連接再收發(fā),UDP直接發(fā)包;
  3. recv緩沖區(qū)要合理設置,太小會讀不全數(shù)據(jù);
  4. 一定要設置超時,避免無限阻塞;
  5. 服務端綁定 0.0.0.0 才能對外網(wǎng)與局域網(wǎng)開放;綁定 127.0.0.1 僅本機訪問;
  6. 短連接收發(fā)完畢及時close,避免大量TIME_WAIT占用端口。

如果你需要,我可以繼續(xù)寫:

  1. 多線程TCP服務端
  2. asyncio異步socket并發(fā)探測
  3. 自定義TCP分包協(xié)議解決粘包完整版代碼。

到此這篇關于一文詳解Python中socket庫的完整使用教程的文章就介紹到這了,更多相關Python socket庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • TensorFlow實現(xiàn)卷積神經(jīng)網(wǎng)絡

    TensorFlow實現(xiàn)卷積神經(jīng)網(wǎng)絡

    這篇文章主要為大家詳細介紹了TensorFlow實現(xiàn)卷積神經(jīng)網(wǎng)絡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Python?tkinter庫繪圖實例分享

    Python?tkinter庫繪圖實例分享

    這篇文章主要給大家分享了Python?tkinter庫繪圖實例,主要分享實例有小房子繪制、彩色氣泡動畫繪制內(nèi)容,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-04-04
  • Python調(diào)用OpenAI?API的完整教程

    Python調(diào)用OpenAI?API的完整教程

    文章詳細介紹了將AI大模型GPT接入項目的全過程,包括準備工作、最簡示例、流式輸出、多輪對話、實用技巧、常見錯誤處理等六個部分,并給出示例代碼,同時提供了函數(shù)調(diào)用和模型選擇指南,最后介紹了異步調(diào)用在高并發(fā)場景下的使用方法,需要的朋友可以參考下
    2026-04-04
  • pycharm安裝opencv的實現(xiàn)

    pycharm安裝opencv的實現(xiàn)

    本文主要介紹了pycharm安裝opencv的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-09-09
  • python中pandas.DataFrame排除特定行方法示例

    python中pandas.DataFrame排除特定行方法示例

    這篇文章主要給大家介紹了關于python中pandas.DataFrame排除特定行的方法,文中給出了詳細的示例代碼,相信對大家的理解和學習具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • python類裝飾器用法實例

    python類裝飾器用法實例

    這篇文章主要介紹了python類裝飾器用法,實例分析了Python類裝飾器的相關使用方法,需要的朋友可以參考下
    2015-06-06
  • Python中的整除和取模實例

    Python中的整除和取模實例

    這篇文章主要介紹了Python中的整除和取模實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 開始著手第一個Django項目

    開始著手第一個Django項目

    這篇文章主要介紹了開始著手第一個Django項目的過程,Django是豐富多彩的Python框架中人氣最高的一個,功能多而全,需要的朋友可以參考下
    2015-07-07
  • Pygame如何使用精靈和碰撞檢測

    Pygame如何使用精靈和碰撞檢測

    本文主要介紹了Pygame如何使用精靈和碰撞檢測,它們能夠幫助我們跟蹤屏幕上移動的大量圖像。我們還會了解如何檢測兩個圖像相互重疊或者碰撞的方法。
    2021-11-11
  • 詳解django中視圖函數(shù)的FBV和CBV

    詳解django中視圖函數(shù)的FBV和CBV

    FBV是指視圖函數(shù)以普通函數(shù)的形式,CBV是指視圖函數(shù)以類的方式,這篇文章主要介紹了django中視圖函數(shù)的FBV和CBV,需要的朋友可以參考下
    2022-08-08

最新評論

巨鹿县| 如皋市| 拜泉县| 甘肃省| 遂昌县| 历史| 雷波县| 西和县| 涿州市| 行唐县| 都匀市| 康保县| 齐齐哈尔市| 剑阁县| 巴青县| 漾濞| 砀山县| 丹寨县| 嘉峪关市| 龙里县| 特克斯县| 牡丹江市| 台江县| 方城县| 察隅县| 永嘉县| 福安市| 内乡县| 馆陶县| 宜兴市| 万载县| 富川| 黄骅市| 天气| 平谷区| 新竹县| 和政县| 阜南县| 克东县| 罗定市| 分宜县|