客户端:
import socket client = socket.socket() client.connect(("127.0.0.1", 9999)) while True: cmd = input(">>").strip() if not cmd: # 不能发送空字符串,否则在接收端的recv方法会阻塞 continue client.send(cmd.encode("utf-8")) len_res = int(client.recv(1024).decode("utf-8")) # 这里的长度是服务端发送的数据编码后的长度 length = 0 total_data = b'' # 用空字符串循环接收bytes.接收完了再decode,因为分次接收每次decode可能会出错 while True: res = client.recv(8192) total_data += res length += len(res) if length == len_res:break print(total_data.decode("utf-8")) print("命令大小>>", len_res) print("收到的结果大小",length)
服务器:
import socket import os ''' 注意1: send一次性把结果发送给客户端了。 但客户端只接了1024,剩下的没有扔,放到了缓冲区buffer了 下一次send把缓冲区的先发出去,再把新的数据放入缓冲区 客户端虽然写的收1024.代表最多收1024. 1、缓冲区满了自动发 2、用send强制发 所以send的意思是: 如果缓冲区有数据,就从缓冲区发送一次客户端最大能接收的数据。再把新数据放到缓冲区 如果缓冲区没数据,就把新数据放入缓冲区,再从缓冲区发送一次客户端最大能接收的数据 注意2: len方法判断长度的时候,如果是中文encode之前和之后的长度可能不一样,注意区分 ''' server = socket.socket() server.bind(("0.0.0.0", 9999)) server.listen() while True: conn, address = server.accept() print("来自客户端的连接:", conn) while True: cmd = conn.recv(1024).decode("utf-8") if not cmd: # 如果客户端断开,cmd会进入死循环,一直接收到空字符串 print("client is lost...") break res = os.popen(cmd).read() if len(res) == 0: # 如果命令执行不成功,暂时返回特定的提示 res = "cmd has not output" conn.send(str(len(res.encode("utf-8"))).encode("utf-8")) # 这里注意:有中文的时候编码前和编码后的长度不一样。这里的是编码后的长度 conn.send(res.encode("utf-8"))