本文共 1816 字,大约阅读时间需要 6 分钟。
服务端启动时,首先需要绑定指定的IP地址和端口号。这里使用的端口号是9909。服务端需要监听客户端的连接请求,并准备接收客户端发送的命令。
import socketimport subprocessimport structphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.bind(('127.0.0.1', 9909))phone.listen(5)print('starting...') 服务端进入监听模式后,会等待客户端的连接请求。一旦有客户端连接,服务端就会接收并处理客户端发送的命令。
while True: conn, client_addr = phone.accept() print(f'连接来自:{client_addr}') while True: try: # 接收命令 cmd = conn.recv(8096) if not cmd: break # 执行命令并获取结果 obj = subprocess.Popen( cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) stdout = obj.stdout.read() stderr = obj.stderr.read() # preparing header total_size = len(stdout) + len(stderr) header = struct.pack('i', total_size) # 发送结果 conn.send(header) conn.send(stdout) conn.send(stderr) except ConnectionResetError: break conn.close() 客户端通过socket连接到服务端,发送命令并接收结果。客户端需要处理报头和真实数据。
import socketimport structphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.connect(('127.0.0.1', 9909))while True: cmd = input('> ').strip() if not cmd: continue phone.send(cmd.encode('utf-8')) # 接收结果 header = phone.recv(4) total_size = struct.unpack('i', header)[0] recv_size = 0 recv_data = b'' while recv_size < total_size: recv_data += phone.recv( total_size - recv_size ) recv_size += len(recv_data) 这种方式可以确保客户端能够准确接收服务端返回的完整数据,避免因传输过程中的丢包导致的数据错误。
转载地址:http://fpyg.baihongyu.com/