網絡通訊 sockethtml
這一節太難了,仍是看TA的吧linux
http://www.cnblogs.com/alex3714/articles/5830365.htmlshell
在開始解決上面問題3以前,咱們要考慮,客戶端要循環接收服務器端的大量數據返回直到一條命令的結果所有返回爲止, 但問題是客戶端知道服務器端返回的數據有多大麼?答案是不知道,那既然不知道服務器的要返回多大的數據,那客戶端怎麼知道要循環接收多少次呢?答案是不知道,擦,那咋辦? 總不能靠猜吧?呵呵。。。 固然不能,那隻能讓服務器在發送數據以前主動告訴客戶端,要發送多少數據給客戶端,而後再開始發送數據,yes, 機智如我,搞起。緩存
先簡單測試接收數據量大小服務器
1 import socket 2 import os,subprocess 3 4 5 server = socket.socket() #得到socket實例 6 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 7 8 server.bind(("localhost",9998)) #綁定ip port 9 server.listen() #開始監聽 10 11 while True: #第一層loop 12 print("等待客戶端的鏈接...") 13 conn,addr = server.accept() #接受並創建與客戶端的鏈接,程序在此處開始阻塞,只到有客戶端鏈接進來... 14 print("新鏈接:",addr ) 15 while True: 16 17 data = conn.recv(1024) 18 if not data: 19 print("客戶端斷開了...") 20 break #這裏斷開就會再次回到第一次外層的loop 21 print("收到命令:",data) 22 #res = os.popen(data.decode()).read() #py3 裏socket發送的只有bytes,os.popen又只能接受str,因此要decode一下 23 res = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE).stdout.read() #跟上面那條命令的效果是同樣的 24 if len(res) == 0: 25 res = "cmd exec success,has not output!" 26 conn.send(str(len(res)).endcode("utf-8")) #發送數據以前,先告訴客戶端要發多少數據給它 27 conn.sendall(res.encode("utf-8")) #發送端也有最大數據量限制,因此這裏用sendall,至關於重複循環調用conn.send,直至數據發送完畢 28
29 server.close()
import socket client = socket.socket() client.connect(("localhost",9998)) while True: msg = input(">>:").strip() if len(msg) == 0:continue client.send( msg.encode("utf-8") ) res_return_size = client.recv(1024) #接收這條命令執行結果的大小 print("getting cmd result , ", res_return_size) total_rece_size = int(res_return_size) print(total_rece_size) #print(data.decode()) #命令執行結果 client.close()