import socket,os,time server = socket.socket() server.bind(("localhost",9999)) server.listen() while True: conn,addr=server.accept() print("new conn",addr) while True: print("等待新指令") 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("utf-8")) #先发大小给客户端 #time.sleep(0.5) client_ack =conn.recv(1024)#wait client to confirm 防止粘包 conn.send(cmd_res.encode("utf-8")) print("send done") server.close()
上面是服务端socket_server.py
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) client.send("准备好接收了,loser可以发了".encode("utf-8"))#防止粘包 received_size=0 received_data=b'' while received_size < int(cmd_res_size.decode()): data =client.recv(1024) received_size +=len(data)#每次收到的有可能小于1024,所以用len判断 received_data +=data else: print("cmd res receive done...",received_size) print(received_data.decode()) client.close()
上面是客户端socket_client.py