Python的socket模組及示例

brucexia發表於2023-05-08

socket 由一些物件組成,這些物件提供網路應用程式的跨平臺標準。


認識socket 模組


socket 又稱“套接字”,應用程式通常透過“套接字”向網路發出請求或應答網路請求,使主機間或一臺計算機上的程式間可以通訊。socket 模組提供了標準的網路介面,可以訪問底層作業系統socket 介面的全部方法。

Python 使用socket() 函式建立套接字。其語法格式如下:

socket.socket([family[, type[, protocol]]])

各個引數的含義如下:

1 family :套接字中的網路協議,包括AF_UNIX UNIX 網域協議)和AF_INET IPv4 網域協議,如TCP UDP )。

2 type :套接字型別,包括SOCK_STREAM (使用在TCP 中)、SOCK_DGRAM (使用在UDP 中)、SOCK_RAW (使用在IP 中)和SOCK_SEQPACKET (列表連線模式)。

3 protocol :只使用在family 等於AF_INET type 等於SOCK_RAW 的時候。protocol 是一個常數,用於辨識所使用的協議種類。預設值是0 ,表示適用於所有socket 型別。

每一個socket 物件都有下面的方法:

1 accep t() :接收一個新連線,並且返回兩個數值(conn address )。conn 是一個新的socket 物件,用於在該連線上傳輸資料;address 是此socket 使用的地址。

2 bind(address) :將socket 連線到address 地址,地址的格式為(hostname, port)

3 close() :關閉此socket

4 connect(address) :連線到一個遠端的socket ,其地址為address

5 makefile([mode [, bufsize]]) :建立一個與socket 有關的檔案物件,引數mode bufsize 與內建函式open() 相同。

6 getpeername() :返回socket 所連線的地址,地址的格式為(ipaddr, port)

7 getsockname() :返回socket 本身的地址,地址的格式為(ipaddr, port)

8 listen(backlog) :開啟連線監聽,引數backlog 為最大可等候的連線數目。

9 recv(bufsize [, flags]) :從socket 接收資料,返回值是字串資料。引數bufszie 表示最大的可接收資料量;引數flags 用來指定資料的相關資訊,預設值為0

10 recvfrom(bufsize [, flags]) :從socket 接收資料。返回值是成對的(string, address) ,其中,string 代表接收的字串資料,address 則是socket 傳輸資料的地址。引數bufszie 表示最大的可接收資料量;引數flags 用來指定資料的相關資訊,預設值為0

11 send(string [, flags]) :將資料以字串型別傳輸到socket 。引數flags recv() 方法相同。

12 sendto(string [, flags], address) :將資料傳輸到遠端的socket 。引數flags recv() 方法相同,引數address 是該socket 的地址。

13 shutdown(how) :關閉聯機的一端或兩端。若how 等於0 ,則關閉接收端;若how 等於1 ,則關閉傳輸端;若how 等於2 ,則同時關閉接收端與傳輸端。

建立socket 連線


下面使用socket 模組的socket 函式建立一個socket 物件。socket 物件可以透過呼叫其他函式設定一個socket 服務。透過呼叫 bind(hostname, port) 函式指定服務的埠(port ),然後呼叫socket 物件的accept 方法,該方法等待客戶端的連線並返回connection 物件,表示已連線到客戶端。

【例13.1 】建立伺服器端的socket 服務(原始碼\ch13\13.1.py )。

# 匯入 socket、sys 模組
import socket
import sys
# 建立 socket 物件
serversocket = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM)
# 獲取本地主機名
host = socket.gethostname()
port = 9999
# 繫結埠
serversocket.bind((host, port))
# 設定最大連線數,超過後排隊
serversocket.listen(5)
while True:
    # 建立客戶端連線
    clientsocket,addr = serversocket.accept()     
    print("連線地址: %s" % str(addr))
    msg='折花逢驛使,寄與隴頭人。江南無所有,聊贈一枝春。'+ "\r\n"
    clientsocket.send(msg.encode('utf-8'))
    clientsocket.close()

儲存並執行程式,即可在伺服器端啟動socket 服務。

下面的示例建立一個客戶端,並連線以上建立的服務,埠號為12345

【例13.2 】建立客戶端的連線(原始碼\ch13\13.2.py )。

# 匯入 socket、sys 模組
import socket
import sys
# 建立 socket 物件
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 獲取本地主機名
host = socket.gethostname()
# 設定埠
port = 9999
# 連線服務,指定主機和埠
s.connect((host, port))
# 接收小於 1024 位元組的資料
msg = s.recv(1024)
s.close()
print (msg.decode('utf-8'))

儲存並執行程式,輸出結果如下:

折花逢驛使,寄與隴頭人。江南無所有,聊贈一枝春。

此時在伺服器端顯示的結果如下:

連線地址:('192.168.108',65141)

注意: 第一次執行13.1.py 13.2.py 兩個檔案時,可能會彈出以下錯誤資訊:

ConnectionRefusedError: [WinError 10061] 由於目標計算機積極拒絕,無法連線。

解決方法是關閉上述執行的13.1.py 13.2.py 兩個檔案,然後重新執行這兩個檔案即可。

本文節選自《 Python 程式設計從零開始學(影片教學版) 》,本次內容釋出,獲得作者和出版社授權。

 

 

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18841117/viewspace-2950710/,如需轉載,請註明出處,否則將追究法律責任。

相關文章