You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:16:07