各位學習者,早安!在我們之前的教程中,我們討論了 Python unittest 模組。今天我們將研究 Python socket 編程的範例。我們將創建 Python socket 伺服器和客戶端應用程式。
Python Socket 編程
為了理解 Python socket 編程,我們需要了解三個有趣的主題 – Socket 伺服器、Socket 客戶端 和 Socket。那麼,什麼是伺服器呢?嗯,伺服器是一個軟體,它等待客戶端的請求並相應地提供服務或處理請求。另一方面,客戶端是這項服務的請求者。客戶端程式向伺服器請求某些資源,伺服器對該請求作出回應。Socket 是伺服器和客戶端之間的雙向通訊通道的端點。Socket 可以在同一個進程中進行通訊,也可以在同一台機器上的不同進程之間進行通訊,或者在不同機器上的進程之間進行通訊。對於與遠程程式的任何通訊,我們必須通過 socket 連接。此 socket 編程教程的主要目標是介紹 socket 伺服器和客戶端如何彼此通訊。您還將學習如何編寫 Python socket 伺服器程式。
Python 套接字示例
我們之前已經說過,套接字客戶端請求某些資源給套接字伺服器,伺服器對該請求進行回應。因此,我們將設計伺服器和客戶端模型,使每個都可以與它們通信。步驟可以考慮如下。
- Python 套接字伺服器程序首先執行並等待任何請求
- Python 套接字客戶端程序將首先啟動對話。
- 然後伺服器程序將根據客戶端請求進行相應的回應。
- 如果用戶輸入“bye”消息,客戶端程序將終止。當客戶端程序終止時,伺服器程序也將終止,這是可選的,我們可以將伺服器程序無限期地運行,或者在客戶端請求中使用某些特定命令終止。
Python 套接字伺服器
我們將保存 Python 套接字伺服器程式為 socket_server.py
。 要使用 Python 套接字連線,我們需要導入 socket 模組。 然後,我們需要依序執行一些任務以建立伺服器和客戶端之間的連線。 我們可以使用 socket.gethostname()
函式獲取主機地址。 建議使用大於1024的埠地址,因為小於1024的埠號保留給標準網際網路協定。 看下面的 Python 套接字伺服器示例代碼,註釋將幫助您理解代碼。
import socket
def server_program():
# 獲取主機名
host = socket.gethostname()
port = 5000 # initiate port no above 1024
server_socket = socket.socket() # get instance
# 詳細查看。 bind() 函式接受元組作為參數
server_socket.bind((host, port)) # bind host address and port together
# 配置伺服器可以同時聽取多少客戶端
server_socket.listen(2)
conn, address = server_socket.accept() # accept new connection
print("Connection from: " + str(address))
while True:
# 接收資料流。 它不會接受大於1024字節的資料封包
data = conn.recv(1024).decode()
if not data:
# 如果未接收到資料,則中斷
break
print("from connected user: " + str(data))
data = input(' -> ')
conn.send(data.encode()) # send data to the client
conn.close() # close the connection
if __name__ == '__main__':
server_program()
因此,我們的 Python 套接字伺服器正在5000埠上運行,並且它將等待客戶端請求。 如果您希望伺服器在客戶端連線關閉時不退出,只需刪除 if 條件 和 break 語句。 Python while 迴圈 用於無限運行伺服器程式並等待客戶端請求。
Python 套接字客戶端
我們將將Python套接字客戶端程式保存為socket_client.py
。 這個程式與服務器程式類似,除了綁定之外。 服務器程式和客戶端程式的主要區別在於,在服務器程式中,需要將主機地址和端口地址綁定在一起。 請查看下面的Python套接字客戶端示例代碼,註釋將幫助您理解代碼。
import socket
def client_program():
host = socket.gethostname() # as both code is running on same pc
port = 5000 # socket server port number
client_socket = socket.socket() # instantiate
client_socket.connect((host, port)) # connect to the server
message = input(" -> ") # take input
while message.lower().strip() != 'bye':
client_socket.send(message.encode()) # send message
data = client_socket.recv(1024).decode() # receive response
print('Received from server: ' + data) # show in terminal
message = input(" -> ") # again take input
client_socket.close() # close the connection
if __name__ == '__main__':
client_program()
Python套接字編程輸出
要查看輸出,首先運行套接字服務器程式。 然後運行套接字客戶端程式。 然後,從客戶端程式中輸入一些內容。 然後再次從服務器程式中輸入回覆。 最後,從客戶端程式中輸入bye來終止兩個程式。 下面的短視頻將展示我對套接字服務器和客戶端示例程式的測試運行的工作原理。
pankaj$ python3.6 socket_server.py
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
-> Hello
from connected user: How are you?
-> Good
from connected user: Awesome!
-> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py
-> Hi
Received from server: Hello
-> How are you?
Received from server: Good
-> Awesome!
Received from server: Ok then, bye!
-> Bye
pankaj$
請注意,套接字服務器正在端口5000上運行,但客戶端也需要一個套接字端口來連接到服務器。 此端口由客戶端連接調用隨機分配。 在這種情況下,它是57822。 因此,這就是Python套接字編程,Python套接字服務器和套接字客戶端示例程式的全部內容。 參考:官方文檔
Source:
https://www.digitalocean.com/community/tutorials/python-socket-programming-server-client