使用Socket模块连接服务器发送计算结果时编码报错求助
Socket发送计算结果编码错误修复
核心问题分析
你的代码中发送结果的语句存在字节串与字符串拼接的错误:
s.sendall(b""+result.encode(encoding="ascii")+"\n")
这里"\n"是字符串类型,而result.encode()返回的是字节串类型,两者无法直接拼接,会触发类型错误。
修复方案
将换行符也编码为字节串后再拼接,或者直接格式化字符串后统一编码:
方法1:拼接字节串
s.sendall(result.encode("ascii") + b"\n")
方法2:格式化后统一编码(更简洁)
s.sendall(f"{result}\n".encode("ascii"))
完整修正后的代码
import socket import time ip_address = "37.59.31.202" port = 2000 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((ip_address, port)) print("\nconnected") time.sleep(1) response = s.recv(1024) print(response.decode("utf-8")) print("\nresponse received") time.sleep(1) input() # 移除多余变量a,直接调用input() s.sendall(b"1\n") for i in range(100): response = s.recv(1024) rep = response.decode("utf-8") print(rep) input() response = s.recv(1024) rep = response.decode("utf-8") print(rep) calcul = "" # 简化判断逻辑 for x in rep: if x.isdigit() or x in ("-", "+", "/", "*"): calcul += x result = eval(calcul) result = str(result) # 修复后的发送语句 s.sendall(f"{result}\n".encode("ascii")) print(f"response {result} sent") time.sleep(1)
额外提示
- 使用
eval()存在安全风险,如果服务器发送的计算任务不可信,可能导致代码注入问题,建议改用ast.literal_eval()结合operator模块实现安全计算。 socket.recv(1024)仅能接收最多1024字节的数据,若服务器发送的任务内容超过该长度,需要循环接收直到获取完整数据。
内容的提问来源于stack exchange,提问作者LEONARD ROUVIERE
相关产品推荐
相关产品推荐

