Python提供了兩個級別的訪問網(wǎng)絡(luò)服務(wù)。 在低級別,可以訪問底層操作系統(tǒng)中的基本套接字支持,這允許您實現(xiàn)面向連接和無連接協(xié)議的客戶端和服務(wù)器。
Python還具有提供對特定應(yīng)用級網(wǎng)絡(luò)協(xié)議(如FTP,HTTP等)的更高級別訪問的庫。
本章將了解和學(xué)習(xí)網(wǎng)絡(luò)中最著名的概念 - 套接字編程。
套接字(Sockets)是雙向通信信道的端點。 套接字可以在一個進(jìn)程內(nèi),在同一機(jī)器上的進(jìn)程之間,或者在不同主機(jī)的進(jìn)程之間進(jìn)行通信,主機(jī)可以是任何一臺有連接互聯(lián)網(wǎng)的機(jī)器。
套接字可以通過多種不同的通道類型實現(xiàn):Unix域套接字,TCP,UDP等。 套接字庫提供了處理公共傳輸?shù)奶囟悾约耙粋€用于處理其余部分的通用接口。
套接字有自己的術(shù)語 -
domain - 用作傳輸機(jī)制的協(xié)議族。這些值是常量,例如:AF_INET,PF_INET,PF_UNIX,PF_X25等。
type - 兩個端點之間的通信類型,通常用于面向連接的協(xié)議的SOCK_STREAM和用于無連接協(xié)議的SOCK_DGRAM。
0,這可以用于標(biāo)識域和類型中的協(xié)議的變體。<broadcast>”,它指定一個INADDR_BROADCAST地址。INADDR_ANY,或Fixnum端口號,包含端口號的字符串或服務(wù)名稱。要創(chuàng)建套接字,必須使用套接字模塊中的socket.socket()函數(shù),該函數(shù)具有一般語法 -
s = socket.socket (socket_family, socket_type, protocol = 0)
這里是上述參數(shù)的描述 -
AF_UNIX或AF_INET,如前所述。SOCK_STREAM或SOCK_DGRAM。0。當(dāng)創(chuàng)建了套接字對象這后,就可以使用所需的函數(shù)來創(chuàng)建客戶端或服務(wù)器程序。 以下是所需函數(shù)的列表:
服務(wù)器套接字方法
| 編號 | 方法 | 描述 |
|---|---|---|
| 1 | s.bind() |
此方法將地址(主機(jī)名,端口號對)綁定到套接字。 |
| 2 | s.listen() |
此方法設(shè)置并啟動TCP偵聽器。 |
| 3 | s.accept() |
這被動地接受TCP客戶端連接,等待直到連接到達(dá)(阻塞)。 |
客戶端套接字方法
| 編號 | 方法 | 描述 |
|---|---|---|
| 1 | s.connect() |
此方法主動啟動TCP服務(wù)器連接。 |
通用套接字方法
| 編號 | 方法 | 描述 |
|---|---|---|
| 1 | s.recv() |
此方法接收TCP消息。 |
| 2 | s.send() |
該方法發(fā)送TCP消息 |
| 3 | s.recvfrom() |
此方法接收UDP消息 |
| 4 | s.sendto() |
此方法發(fā)送UDP消息 |
| 5 | s.close() |
此方法關(guān)閉套接字 |
| 6 | socket.gethostname() |
返回主機(jī)名 |
要編寫互聯(lián)網(wǎng)服務(wù)器,可使用socket模塊中可用的socket()來創(chuàng)建套接字對象。 然后使用套接字對象調(diào)用其他函數(shù)來設(shè)置套接字服務(wù)器。
現(xiàn)在調(diào)用bind(hostname,port)函數(shù)來指定主機(jī)上服務(wù)的端口。
接下來,調(diào)用返回對象的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與上面的服務(wù)器程序主機(jī)的連接。 使用Python的socket模塊功能創(chuàng)建套接字客戶端非常簡單。
socket.connect(hosname,port)函數(shù)打開hostname上的port的TCP連接。當(dāng)打開了一個套接字,就可以像任何IO對象一樣讀取它。 完成后,請記住關(guān)閉它,就像關(guān)閉文件一樣。
示例
以下代碼是連接到給定主機(jī)和端口的非常簡單的客戶端,從套接字讀取任何可用數(shù)據(jù),然后退出 -
#!/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'))
現(xiàn)在在后臺運行先運行:server.py,然后運行上面的client.py來查看結(jié)果,如果程序沒有錯誤,那么應(yīng)該得到類似以下以結(jié)果 -

Python網(wǎng)絡(luò)/互聯(lián)網(wǎng)編程中的一些重要模塊的列表如下:
| 協(xié)議 | 通用功能 | 端口號 | 對應(yīng)Python模塊 |
|---|---|---|---|
| HTTP | 網(wǎng)頁服務(wù) | 80 | httplib, urllib, xmlrpclib |
| NNTP | Usenet新聞 | 119 | nntplib |
| FTP | 文件傳輸 | 20 | ftplib, urllib |
| SMTP | 發(fā)送郵件 | 25 | smtplib |
| POP3 | 獲取電子郵件 | 110 | poplib |
| IMAP4 | 獲取電子郵件 | 143 | imaplib |
| Telnet | 命令行 | 23 | telnetlib |
| Gopher | 文檔傳輸 | 70 | gopherlib, urllib |
請檢查上述所有庫,以使用FTP,SMTP,POP和IMAP協(xié)議。
進(jìn)一步閱讀
這是Socket編程的一個快速開始。 這是一個廣闊的話題。 建議通過以下鏈接查找更多詳細(xì)信息 -