本文共 2589 字,大约阅读时间需要 8 分钟。
为了更好地微调客户端和服务器代码,提高其连接的稳定性和兼容性,可以按照以下步骤进行优化:
客户端代码优化:
# client.pyimport 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 = struct.pack('i', (len(cmd.encode('utf-8')) + 1024)) # 预留头信息 phone.send(header) total_size = header[3] # 获取大小 recv_data = b'' recv_size = 0 while recv_size < total_size: res = phone.recv(1024) if not res: break recv_data += res recv_size += len(res) print(recv_data.decode('utf-8'), end='\n')phone.close()
2. ** socket 设置优化**:设置socket选项,使其在多次连接时更稳定,调整socket选项: ```python phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) phone.bind(('0.0.0.0', 9909))
服务端代码优化:
# server.pyimport socketimport subprocessimport structphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.bind(('0.0.0.0', 9909))phone.listen(5)print('Starting...')while True: conn, client_addr = phone.accept() client_addr_str = str(client_addr) print(f'Connected by {client_addr_str}') with conn: while True: try: cmd = conn.recv(8096).decode('utf-8') if not cmd: break obj = subprocess.Popen( cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) stdout = obj.stdout.read() stderr = obj.stderr.read() header = struct.pack('i', len(stdout) + len(stderr)) conn.sendall(header) conn.sendall(stdout.encode('utf-8') + stderr.encode('utf-8')) except ConnectionResetError: breakphone.close()
2. **线程管理优化**:使用with语句确保socket及相关资源自动释放,避免资源泄漏: ```python with conn: # 处理连接逻辑
命令安全处理:限制命令执行权限,避免恶意攻击:
max_cmd_len = 1024if len(cmd) > max_cmd_len: cmd = cmd[:max_cmd_len]obj = subprocess.Popen( cmd, shell=False, stderr=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
数据发送优化:防止数据丢包,使用sendall:
conn.sendall(header)conn.sendall(stdout + stderr)
模型示例调整:
phone.setsocketoption(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 600)
本地测试建议:
netcat
测试连接:nc -zvz 127.0.0.1 9909
总结:通过以上优化措施,客户端/服务器代码应能更加稳定可靠,适用于更广泛的用途。建议进行逐步测试,确保每个部分正常工作后再整合运行。如有继续问题,请详细记录日志和错误信息,供进一步分析。
转载地址:http://xdyzk.baihongyu.com/