一.Socket
簡稱套接字,是進程之間通信的一個工具,好比現實生活中的插座,所有的家用電器要想工作都是基于插座進行,進程之間要想進行網絡通信需要Socket,Socket好比數據的搬運工~
2個進程之間通過Socket進行相互通訊,就必須有服務端和客戶端。
- 服務端:等待其他進程的連接,可接受發來的消息、可以回復消息~
- 客戶端: 主動連接服務端,可以發送消息,可以接受回復~
一個服務端可以接受多個客戶端發來的消息,如下圖:
?
二.服務端開發
1.導入socket包
2.創建一個Socket對象
socket_server = socket.socket()
3.綁定IP地址和端口
socket_server.bind(('localhost', 1319))
端口號自定義,但別和nodejs、Jupyter、MySQL或者Tomcat這些重合了就行~?
4.監聽端口
socket_server.listen(1)
函數內參數設置為1,表示同時最多接受1個客戶端的連接。?
5.等待客戶端連接
這里使用accept方法,這是一個阻塞方法:如果沒有連接,則后續的代碼皆不執行~
conn, addr = socket_server.accept()
accept返回的是一個二元元組:
- conn:客戶端和服務端的連接對象
- address:客戶端的地址信息
測試連接情況:
print(f"Connected by: {addr}")
6.接受客戶端信息
data:str = conn.recv(1024).decode('utf-8')
#類型注釋,字符串型
recv接受的參數是緩沖區大小,這里一般給1024即可。此外其返回值為一個字節數組也即bytes對象,需要decode方法通過UTF-8編碼,將字節數組轉換為字符串對象~
print(f"message:{data}")
7.回復消息
msg=input("回復消息:").encode('utf-8')
conn.send(msg)
?input鍵入的是字符串對象,因此需要先編碼為字節數組~
8.關閉鏈接
conn.close()
socket_server.close()
三.客戶端開發
總的來說異曲同工,甚至更為簡易:
import socket
socket_client= socket.socket()
socket_client.connect(('127.0.0.1', 1325)) #就是localhost,別猶豫
socket_client.send(bytes('Hello, client!', 'utf-8'))
recv_data=socket_client.recv(1024)
print(f"回復的消息是:{recv_data.decode('utf-8')}")
socket_client.close()
四.測試
將兩個py文件都運行起來:
服務端已經收到了客戶端發來的消息了,這時我們回復以后,客戶端亦可正常收到~