from socket import * import subprocess server = socket(AF_INET, SOCK_STREAM) server.bind(('127.0.0.1', 8000)) server.listen(5) print('start...') while True: conn, client_addr = server.accept() while True: print('from client:', client_addr) cmd = conn.recv(1024) if len(cmd) == 0: break print('cmd:', cmd) obj = subprocess.Popen(cmd.decode('utf8'), # 輸入的cmd命令 shell=True, # 經過shell運行 stderr=subprocess.PIPE, # 把錯誤輸出放入管道,以便打印 stdout=subprocess.PIPE) # 把正確輸出放入管道,以便打印 stdout = obj.stdout.read() # 打印正確輸出 stderr = obj.stderr.read() # 打印錯誤輸出 conn.send(stdout) conn.send(stderr) conn.close() server.close()
import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('127.0.0.1', 8000)) while True: data = input('please enter your data') client.send(data.encode('utf8')) data = client.recv(1024) print('from server:', data) client.close()
輸入dir
命令,因爲服務端發送字節少於1024字節,客戶端能夠接受。shell
輸入tasklist
命令,因爲服務端發送字節多於1024字節,客戶端只接受部分數據,而且當你再次輸入dir
命令的時候,客戶端會接收dir
命令的結果,可是會打印上一次的剩餘未發送完的數據,這就是粘包問題。socket