python學習之day08
阿新 • • 發佈:2017-08-20
popen try soc bsp host 結果 res style str
ssh服務器:
服務器:
1 import socket 2 import subprocess 3 4 host = ‘127.0.0.1‘ 5 port = 8080 6 listen_max = 5 7 recv_max = 1024 8 9 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 10 server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 11 server.bind((host,port)) 12 server.listen(listen_max)13 14 while True: 15 conn,clint_addr = server.accept() 16 print(clint_addr) 17 while True: 18 try: 19 cmd = conn.recv(recv_max) 20 if not cmd:continue 21 22 #只能從管道裏讀一次結果 23 #編碼是以當前所在的系統為準的 24 #如果是windows,那麽res.stdout.read()讀出的就是GBK編碼的 在接收端需要用GBK解碼25 res = subprocess.Popen(cmd.decode(‘utf-8‘),shell = True,stdout=subprocess.PIPE, stderr=subprocess.PIPE) 26 # 既有正確stdout結果,又有錯誤stderr結果 27 stdout = res.stdout.read() 28 stderr = res.stderr.read() 29 conn.send(stdout + stderr) 30 exceptException as e: 31 break 32 conn.close() 33 34 server.close()
客戶端:
1 import socket 2 3 host = ‘127.0.0.1‘ 4 port = 8080 5 listen_max = 5 6 recv_max = 1024 7 8 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 9 client.connect((host,port)) 10 11 while True: 12 cmd = input(‘>>: ‘).strip() 13 if not cmd:continue 14 client.send(cmd.encode(‘utf-8‘)) 15 cmd_rec = client.recv(recv_max) 16 print(cmd_rec.decode(‘utf-8‘)) 17 18 client.close()
粘包:
只有TCP有粘包現象,UDP永遠不會粘包。
所謂粘包問題主要還是因為接收方不知道消息之間的界限,不知道一次性提取多少字節的數據所造成的。
python學習之day08