Python網路程式設計(Sockets)


Python提供了兩個級別的存取網路服務。 在低階別,可以存取底層作業系統中的基本通訊端支援,這允許您實現面向連線和無連線協定的用戶端和伺服器。

Python還具有提供對特定應用級網路協定(如FTP,HTTP等)的更高階別存取的庫。

本章將了解和學習網路中最著名的概念 - 通訊端程式設計。

1.什麼是通訊端?

通訊端(Sockets)是雙向通訊通道的端點。 通訊端可以在一個進程內,在同一機器上的進程之間,或者在不同主機的進程之間進行通訊,主機可以是任何一台有連線網際網路的機器。

通訊端可以通過多種不同的通道型別實現:Unix域通訊端,TCP,UDP等。 通訊端庫提供了處理公共傳輸的特定類,以及一個用於處理其餘部分的通用介面。

通訊端有自己的術語 -

  • domain - 用作傳輸機制的協定族。這些值是常數,例如:AF_INETPF_INETPF_UNIXPF_X25等。

  • type - 兩個端點之間的通訊型別,通常用於面向連線的協定的SOCK_STREAM和用於無連線協定的SOCK_DGRAM

  • protocol - 通常為0,這可以用於標識域和型別中的協定的變體。
  • hostname - 網路介面的識別符號 -
    • 一個字串,可以是一個主機名,一個有四個點符號的IP地址,或一個冒號中的IPV6地址(可能是點)符號。
    • 一個字串「<broadcast>」,它指定一個INADDR_BROADCAST地址。
    • 零長度字串,指定INADDR_ANY,或
    • 整數,以主機位元組順序解釋為二進位制地址。
  • port - 每個伺服器監聽一個或多個埠的用戶端的呼叫。埠可能是Fixnum埠號,包含埠號的字串或服務名稱。

2. socket模組

要建立通訊端,必須使用通訊端模組中的socket.socket()函式,該函式具有一般語法 -

s = socket.socket (socket_family, socket_type, protocol = 0)

這裡是上述引數的描述 -

  • socket_family - 它的值可以是:AF_UNIXAF_INET,如前所述。
  • socket_type - 它的值可以是:SOCK_STREAMSOCK_DGRAM
  • protocol - 這通常被省略,預設為0

當建立了通訊端物件這後,就可以使用所需的函式來建立用戶端或伺服器程式。 以下是所需函式的列表:

伺服器通訊端方法

編號 方法 描述
1 s.bind() 此方法將地址(主機名,埠號對)係結到通訊端。
2 s.listen() 此方法設定並啟動TCP偵聽器。
3 s.accept() 這被動地接受TCP用戶端連線,等待直到連線到達(阻塞)。

用戶端通訊端方法

編號 方法 描述
1 s.connect() 此方法主動啟動TCP伺服器連線。

通用通訊端方法

編號 方法 描述
1 s.recv() 此方法接收TCP訊息。
2 s.send() 該方法傳送TCP訊息
3 s.recvfrom() 此方法接收UDP訊息
4 s.sendto() 此方法傳送UDP訊息
5 s.close() 此方法關閉通訊端
6 socket.gethostname() 返回主機名

3.一個簡單的伺服器

要編寫網際網路伺服器,可使用socket模組中可用的socket()來建立通訊端物件。 然後使用通訊端物件呼叫其他函式來設定通訊端伺服器。

現在呼叫bind(hostname,port)函式來指定主機上服務的埠。

接下來,呼叫返回物件的accept()方法。 此方法在您指定的埠等待用戶端連線,連線成功後返回一個連線(connection)物件,該物件表示與該用戶端的連線。

#!/usr/bin/python3           # This is server.py file
import socket

# create a socket object
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 8088

# bind to the port
serversocket.bind((host, port))                                  
print("Server start at port: 8088")
# queue up to 5 requests
serversocket.listen(5)                                           

while True:
    # establish a connection
    clientsocket,addr = serversocket.accept()      

    print("Got a connection from %s" % str(addr))

    msg='Thank you for connecting'+ "\r\n"
    clientsocket.send(msg.encode('ascii'))
    clientsocket.close()

4.一個簡單的用戶端

下面接著編寫一個非常簡單的用戶端程式,開啟與給定埠8088與上面的伺服器程式主機的連線。 使用Python的socket模組功能建立通訊端用戶端非常簡單。

socket.connect(hosname,port)函式開啟hostname上的port的TCP連線。當開啟了一個通訊端,就可以像任何IO物件一樣讀取它。 完成後,請記住關閉它,就像關閉檔案一樣。

範例

以下程式碼是連線到給定主機和埠的非常簡單的用戶端,從通訊端讀取任何可用資料,然後退出 -

#!/usr/bin/python3           # This is client.py file

import socket

# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()

port = 8088

# connection to hostname on the port.
s.connect((host, port))

# Receive no more than 1024 bytes
msg = s.recv(1024)

s.close()

print (msg.decode('ascii'))

現在在後台執行先執行:server.py,然後執行上面的client.py來檢視結果,如果程式沒有錯誤,那麼應該得到類似以下以結果 -

5. Python網際網路模組

Python網路/網際網路程式設計中的一些重要模組的列表如下:

協定 通用功能 埠號 對應Python模組
HTTP 網頁服務 80 httplib, urllib, xmlrpclib
NNTP Usenet新聞 119 nntplib
FTP 檔案傳輸 20 ftplib, urllib
SMTP 傳送郵件 25 smtplib
POP3 獲取電子郵件 110 poplib
IMAP4 獲取電子郵件 143 imaplib
Telnet 命令列 23 telnetlib
Gopher 文件傳輸 70 gopherlib, urllib

請檢查上述所有庫,以使用FTP,SMTP,POP和IMAP協定。

進一步閱讀

這是Socket程式設計的一個快速開始。 這是一個廣闊的話題。 建議通過以下連結查詢更多詳細資訊 -