Python Socket程序
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()函數,該函數具有以下常規語法:
# Filename : example.py # Copyright : 2020 By Codebaoku # Author by : www.090948.com # Date : 2020-08-25 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方法。此方法將一直等到客戶端連接到您指定的端口,然后返回表示該客戶端連接的連接對象。
# Filename : example.py # Copyright : 2020 By Codebaoku # Author by : www.090948.com # Date : 2020-08-25 #!/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對象一樣從中讀取套接字。完成后,記得關閉它,就像關閉文件一樣。
以下代碼是一個非常簡單的客戶端,該客戶端連接到給定的主機和端口,從套接字讀取任何可用數據,然后退出:
# Filename : example.py # Copyright : 2020 By Codebaoku # Author by : www.090948.com # Date : 2020-08-25 #!/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上方運行以查看結果。
# Filename : example.py # Copyright : 2020 By Codebaoku # Author by : www.090948.com # Date : 2020-08-25 # Following would start a server in background. $ python server.py & # Once server is started run client as follows: $ python client.py
將產生以下結果 :
# Filename : example.py # Copyright : 2020 By Codebaoku # Author by : www.090948.com # Date : 2020-08-25 Got connection from ('127.0.0.1', 48437) Thank you for connecting
公開網址的套接字
在下面的示例中,使用套接字模塊中的幾種方法來查找服務器的地址信息和主機名詳細信息。
# Filename : example.py # Copyright : 2020 By Codebaoku # Author by : www.090948.com # Date : 2020-08-25 import socket from pprint import pprint # get server address addrinfo = socket.getaddrinfo('yapf.com', 'www') pprint(addrinfo) # get server hostname print socket.gethostname()
執行上面示例代碼,得到以下結果:
# Filename : example.py # Copyright : 2020 By Codebaoku # Author by : www.090948.com # Date : 2020-08-25 [( , , 17,'',('59.110.239.6', 80)), ( , , 6, '', ('59.110.239.6', 80))]
- python中f字符串以及其常見用法介紹
- 在Python里面調用Golang代碼的方法
- Python異步之怎么保護任務免于取消
- Python異步之在Asyncio中怎么運行阻塞任務
- 如何使用Python點云生成3D網格
- Python IP地址
- Python DNS查找
- Python HTTP標頭
- Python 自定義HTTP請求
- Python HTTP數據下載
- Python 構建URL
- Python Web表單提交
- Python 數據庫和SQL
- Python Telnet
- Python 上傳數據
- Python列出目錄
- Python 同步線程
- Python 線程通信
- Python 線程池
- Python 反應式編程