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

Python Socket客户端无法连接服务器:Pygame位置追踪问题排查

问题

我正在开发一个需要客户端与服务器配合的Pygame玩家位置追踪程序。客户端使用如下Network类实现网络功能:

import socket
import json

class Network:
    def __init__(self):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server = "0.0.0.0"
        self.port = 5555
        self.addr = (self.server, self.port)
        self.pos = self.connect()

    def getPos(self):
        return self.pos

    def connect(self):
        try:
            self.client.connect(self.addr)
            return self.client.recv(2048).decode()
        except:
            pass

    def send(self, data):
        try:
            self.client.send(str.encode(data))
            return self.client.recv(2048).decode()
        except socket.error as e:
            print(e)

同时使用read_pos和make_pos函数处理收发数据的JSON格式转换:

def read_pos(str):
    print(str)
    print(type(str))
    return json.loads(str)  # returns as tuple


def make_pos(tup):
    return json.dumps(tup)

在main函数中,我创建了Network实例n并调用n.connect(),未出现报错,但后续执行startPos = read_pos(n.getPos())时触发错误:

raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not NoneType

经排查发现客户端并未实际连接到服务器,导致传入read_pos的参数为NoneType从而引发报错。请问是什么原因导致客户端无法连接服务器?

可能的原因及解决办法
  • 服务器地址配置错误:客户端代码中self.server = "0.0.0.0"是服务器监听所有网卡的占位符,不能作为客户端的连接目标。本地测试时改成"127.0.0.1",跨设备连接则替换为服务器的真实IP(如局域网192.168.x.x或公网IP)。

  • 服务器未正常启动或监听端口:如果服务器程序未运行,或者未完成socket.bind((server_ip, 5555))和socket.listen()的初始化步骤,客户端会连接失败。检查服务器进程状态,确认端口绑定和监听逻辑正确。

  • 防火墙或网络规则拦截:本地防火墙、杀毒软件或网络安全组可能阻止了5555端口的通信。临时关闭防火墙测试,或在防火墙中添加允许该端口的入站/出站规则;跨网络连接时需确保服务器端已配置端口转发。

  • 客户端异常处理过于隐蔽:connect()方法用except:捕获所有异常但无任何输出,导致连接失败时无法定位具体问题。修改该方法,在异常块中打印错误信息:

    def connect(self):
        try:
            self.client.connect(self.addr)
            return self.client.recv(2048).decode()
        except Exception as e:
            print(f"连接失败详情: {e}")
    

    这样能直接看到连接超时、拒绝连接等具体错误,快速排查问题。

  • 服务器未及时发送初始数据:即使连接成功,若服务器未在客户端连接后立即发送合法的JSON格式位置数据,recv()会阻塞或返回空值,最终导致pos为None。检查服务器代码,确认连接建立后立刻发送了符合要求的JSON字符串。

内容的提问来源于stack exchange,提问作者StratCharl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:35:20