一、socket服務(wù)端代碼
"""
演示Socket服務(wù)端開發(fā)
"""
import socket
# 創(chuàng)建Socket對象
socket_server = socket.socket()
# 綁定ip地址和端口
socket_server.bind(("localhost",8888))
# 監(jiān)聽端口
socket_server.listen(1)
# listen方法內(nèi)接受一個整數(shù)傳參數(shù),表示接受的連接數(shù)量
# 等待客戶端連接
conn, address = socket_server.accept()
"""
此行代碼分開寫:
result:tuple = socket_server.accept()
conn = result[0] # 客戶端和服務(wù)端的連接對象
address = result[1] # 客戶端的地址信息
"""
# accept方法返回的是二元元組(連接對象,客戶端地址信息)
# 可以通過 變量1,變量2 = socket_server.accept()的形式,直接接受二元元組內(nèi)的兩個元素
# accept()方法,是阻塞的方法,等待客戶端的連接,如果沒有連接,就卡在這一行不向下執(zhí)行了
print(f"接收到了客戶端的連接,客戶端的信息是:{address}")
while True:
# 接收客戶端信息,要使用客戶端和服務(wù)端的本次連接對象,而非socket_server對象
data: str = conn.recv(1024).decode("UTF-8")
# recv接受的參數(shù)是緩沖區(qū)大小,一般給1024即可
# recv方法的返回值是一個字節(jié)數(shù)組也就是bytes對象,不是字符串,可以通過decode方法使用UTF-8編碼,將字節(jié)數(shù)組轉(zhuǎn)換為字符串對象
# decode解碼
print(f"接收到客戶端的信息:{data}")
# 發(fā)送回復(fù)消息
msg = input("請輸入你要回復(fù)的消息:")
if msg == 'exit':
break
# send發(fā)送的需要是bytes對象,使用encode方法使用UTF-8編碼,將字符串對象轉(zhuǎn)換為字節(jié)數(shù)組
# encode編碼
conn.send(msg.encode("UTF-8"))
# 關(guān)閉連接
conn.close()
socket_server.close()
二、socket客戶端代碼
"""
演示socket客戶端開發(fā)
"""
import socket
# 創(chuàng)建socket對象
socket_client = socket.socket()
# 連接到服務(wù)端
socket_client.connect(("localhost",8888))
while True:
# 發(fā)送消息
msg = input("請輸入客戶端要發(fā)送的消息:")
if msg == 'exit':
break
# encode編碼
socket_client.send(msg.encode("UTF-8"))
# 接收返回消息
data:str = socket_client.recv(1024) # 1024是緩沖區(qū)的大小,一般1024即可,同樣recv方法是阻塞的
# decode解碼
print(f"接收服務(wù)端發(fā)來的消息是:{data.decode('UTF-8')}")
# 關(guān)閉連接
socket_client.close()
三、socket通信截圖
socket服務(wù)端和客戶端通信的完整過程.PNG