Python提供了對網路服務的兩個訪問級別。在較低的級別上,可以訪問底層操作系統中的基本套接字支持,從而可以為面向連接和無連接的協議實現客戶端和服務器。
Python還具有提供對特定應用程式級網路協議(例如FTP,HTTP等)的更高級別訪問的庫。
套接字是雙向通信通道的端點。套接字可以在一個進程內,同一臺機器上的進程之間或不同大陸上的進程之間進行通信。在python中使用套接字模塊來創建和使用套接字。
套接字有自己的辭彙表 -
編號 | 術語 | 描述 |
---|---|---|
1 | Domain | 用作傳輸機制的協議系列。這些值是常量,例如:AF_INET ,PF_INET ,PF_UNIX ,PF_X25 等。 |
2 | type | 兩個端點之間的通信類型,通常是面向連接協議的SOCK_STREAM 和無連接協議的SOCK_DGRAM 。 |
3 | protocol | 通常為零,可用於標識域和類型內協議的變體。 |
4 | hostname | 網路介面的識別字 |
5 | port | 每臺伺服器偵聽在一個或多個端口上調用的客戶端。端口可以是Fixnum 端口號,包含端口號的字串或服務名稱。 |
Socket模組
要創建套接字,必須使用套接字模塊中可用的socket.socket()
函數,該函數具有以下常規語法:
s = socket.socket (socket_family, socket_type, protocol=0)
這是參數的描述-
socket_family
- 如前所述,它是AF_UNIX
或AF_INET
。socket_type
- 它是SOCK_STREAM
或SOCK_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() |
返回主機名稱。 |
簡單的伺服器
要編寫Internet伺服器,我們使用套接字模塊中可用的套接字函數來創建套接字對象。然後使用套接字對象調用其他函數來設置套接字伺服器。
現在調用bind(hostname,port)
函數為給定主機上的服務指定一個端口。接下來,調用返回對象的accept方法。此方法將一直等到客戶端連接到您指定的端口,然後返回表示該客戶端連接的連接對象。
#!/usr/bin/python # This is server.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.bind((host, port)) # Bind to the port
s.listen(5) # Now wait for client connection.
while True:
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
c.send('Thank you for connecting')
c.close() # Close the connection
簡單的客戶端
讓我們編寫一個非常簡單的客戶端程式,該程式打開到給定端口12345
和給定主機的連接。使用Python的套接字模塊函數創建套接字客戶端非常簡單。
socket.connect(hosname,port)
在端口上打開到主機名的TCP連接。打開套接字後,可以像讀取任何IO對象一樣從中讀取套接字。完成後,記得關閉它,就像關閉檔一樣。
以下代碼是一個非常簡單的客戶端,該客戶端連接到給定的主機和端口,從套接字讀取任何可用數據,然後退出-
#!/usr/bin/python # This is client.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.connect((host, port))
print s.recv(1024)
s.close # Close the socket when done
在後臺運行此server.py,然後在client.py上方運行以查看結果。
# Following would start a server in background.
$ python server.py &
# Once server is started run client as follows:
$ python client.py
將產生以下結果 -
Got connection from ('127.0.0.1', 48437)
Thank you for connecting
公開網址的套接字
在下面的示例中,使用套接字模塊中的幾種方法來查找伺服器的地址資訊和主機名詳細資訊。
import socket
from pprint import pprint
# get server address
addrinfo = socket.getaddrinfo('xuhuhu.com', 'www')
pprint(addrinfo)
# get server hostname
print socket.gethostname()
執行上面示例代碼,得到以下結果:
[(2, 1, 0, '', ('213.130.81.5', 80))]
DESKTOP-MAXSU