Python提供了兩個級別的存取網路服務。 在低階別,可以存取底層作業系統中的基本通訊端支援,這允許您實現面向連線和無連線協定的用戶端和伺服器。
Python還具有提供對特定應用級網路協定(如FTP,HTTP等)的更高階別存取的庫。
本章將了解和學習網路中最著名的概念 - 通訊端程式設計。
通訊端(Sockets)是雙向通訊通道的端點。 通訊端可以在一個進程內,在同一機器上的進程之間,或者在不同主機的進程之間進行通訊,主機可以是任何一台有連線網際網路的機器。
通訊端可以通過多種不同的通道型別實現:Unix域通訊端,TCP,UDP等。 通訊端庫提供了處理公共傳輸的特定類,以及一個用於處理其餘部分的通用介面。
通訊端有自己的術語 -
domain - 用作傳輸機制的協定族。這些值是常數,例如:AF_INET
,PF_INET
,PF_UNIX
,PF_X25
等。
type - 兩個端點之間的通訊型別,通常用於面向連線的協定的SOCK_STREAM
和用於無連線協定的SOCK_DGRAM
。
0
,這可以用於標識域和型別中的協定的變體。<broadcast>
」,它指定一個INADDR_BROADCAST
地址。INADDR_ANY
,或Fixnum
埠號,包含埠號的字串或服務名稱。要建立通訊端,必須使用通訊端模組中的socket.socket()
函式,該函式具有一般語法 -
s = socket.socket (socket_family, socket_type, protocol = 0)
這裡是上述引數的描述 -
AF_UNIX
或AF_INET
,如前所述。SOCK_STREAM
或SOCK_DGRAM
。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() |
返回主機名 |
要編寫網際網路伺服器,可使用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()
下面接著編寫一個非常簡單的用戶端程式,開啟與給定埠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
來檢視結果,如果程式沒有錯誤,那麼應該得到類似以下以結果 -
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程式設計的一個快速開始。 這是一個廣闊的話題。 建議通過以下連結查詢更多詳細資訊 -