標籤:blog 解決 com 客戶 取資料 accept 大資料 ref get
Socket接收大資料
上一篇部落格,就是說當伺服器發送至用戶端的資料,大於用戶端設定的資料,則就會把資料服務端發過來的資料剩餘資料存在IO緩衝區中,這樣就會造成我們想要擷取資料的完整性。
解決思路:
1、改大用戶端接收的資料的大小,因為官方建議最多隻能接收8k的資料,那服務端發送過來的資料很容易就會大於8K,這個思路並不能從根本上解決問題(不建議使用)
2、用戶端可以多收幾次,服務端給用戶端發資料之前,先計算一下要發給用戶端資料大小(len()判斷檔案長度) ,比如說要發給用戶端資料是5k大小,先把5K這個值發送給用戶端,用戶端知道總共會接收5K的值,就知道需要接收多少次了,迴圈接收,直到5k資料全部接收完畢為止。
邏輯流程圖:
服務端代碼:
import socket,os server = socket.socket()server.bind(("localhost",9999))server.listen(5)while True: conn,addr = server.accept() print("new addr:",addr) while True: data = conn.recv(1024) if not data: print("用戶端已斷開") break print("執行指令:",data) cmd_res = os.popen(data.decode()).read() print("before send:",len(cmd_res)) if len(cmd_res) == 0: cmd_res = "cmd has no output...." conn.send( str(len(cmd_res.encode())).encode() ) #發送服務端發送給用戶端資料的長度 conn.send(cmd_res.encode("utf-8")) #發送服務端的資料 print("send done")server.close()
用戶端代碼:
import socket client = socket.socket()client.connect(("localhost",9999)) while True: cmd = input(">>>:").strip() if len(cmd) == 0:continue client.send(cmd.encode("utf-8")) cmd_res_size = client.recv(1024) #接收命令的長度 print("命令結果大小:",cmd_res_size.decode()) recevied_size = 0 #接收用戶端發來資料的計算機 recevied_data = b‘‘ #用戶端每次發來內容的計數器 while recevied_size < int(cmd_res_size.decode()): #當接收的資料大小 小於 用戶端發來的資料 cmd_res = client.recv(1024) recevied_size += len(cmd_res) #每次收到的服務端的資料有可能小於1024,所以必須用len判斷 recevied_data += cmd_res else: print(recevied_data.decode("utf-8","ignore")) print("cmd res receive done ....",recevied_size) client.close()
【python】-- Socket接收大資料