首页 > 解决方案 > 套接字错误。AttributeError: 'NoneType' 对象没有属性 'listen'

问题描述

我正在尝试编写一个简单的 TCP 套接字服务器。

我收到此错误:

  File "patch", line 9, in __init__
    self.__SocketServer__.listen(1)
AttributeError: 'NoneType' object has no attribute 'listen'

我不明白为什么。

代码:

class DataManager:
    def __init__(self):
        self.__port__ = 2121
        self.__ip__ = "127.0.0.1"
        self.__SocketServer__ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.__SocketServer__ = self.__SocketServer__.bind((self.__ip__, self.__port__))
        self.__SocketServer__.listen(1)
        self.__log__("Waiting car connection...")
        self.__CarSocket__, addr = self.__SocketServer__.accept()
        self.__log__("Car socket connected")
        self.__CarSocket__ = None

标签: pythonsockets

解决方案


socket.bind()返回None。不要将此分配回您的套接字属性:

self.__SocketServer__ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.__SocketServer__.bind((self.__ip__, self.__port__))
self.__SocketServer__.listen(1)

附带说明:不要__doubleunderscore__为自己的项目使用名称。Python保留此类名称供自己使用。

如果要将名称标记为实例内部,请在名称开头使用单下划线。Python 类没有隐私模型,所有属性始终可以从外部访问。

所以这就足够了:

class DataManager:
    def __init__(self):
        self._port = 2121
        self._ip = "127.0.0.1"

        self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._socket.bind((self._ip, self._port))
        self._socket.listen(1)

        self._log("Waiting car connection...")
        self._connection, addr = self._socket.accept()
        self._log("Car socket connected")
        self._connection = None

我为套接字和连接使用了更常用的名称,也遵循Python 样式指南


推荐阅读