客户端代码,监听端口号为 localhost 9999
#!/usr/local/bin/python3 # -*- coding:utf-8 -*- 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.decode()) # 防止粘包-装逼方法 client.send("接收成功".encode("utf-8")) # print(cmd_res) received_size = 0 while received_size < int(cmd_res_size.decode()): data = client.recv(1024) received_size += len(data) print(data.decode()) print("-----%s-----" % len(data)) else: print("received done...", cmd_res_size.decode()) client.close()
服务器端代码
#!/usr/local/bin/python3 # -*- coding:utf-8 -*- 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: data = conn.recv(1024) if not data: print("客户端断开连接") break print("执行指令:", data) cmd_res = os.popen(data.decode()).read() conn.send(str(len(cmd_res)).encode("utf-8")) # 先发大小给客户端 # 防止粘包-low的方法 # time.sleep(0.5) # 强制缓冲区超时,防止粘包 # 防止粘包-装逼方法 # 在两次send中间强制进行一次收发,这样就能有效防止粘包 ack = conn.recv(1024) print(">>>>>:", ack.decode()) tmp = conn.send(cmd_res.encode("utf-8")) print(">>>>>: 发送成功") server.close()