1. 程式人生 > >python學習之day08

python學習之day08

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 except
Exception 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