Ошибка: объект 'socket' не имеет атрибута 'create_connection' - PullRequest
0 голосов
/ 13 июля 2020

Я пытался подключиться к удаленному серверу с сокетом python, для этого я использую create_connection, но когда мой клиент пытается подключиться к этому серверу, он показывает эту ошибку

AttributeError: 'socket' object has no attribute 'create_connection'

Вот мой code

    def _connect(self):
        print("Connecting to ",self.hostname,self.port)
        self.sock.create_connection((self.hostname, self.port))
        print("Connection successfull")

Имя хоста и порт инициализируются в Конструкторе

    def __init__(self, host, port, path, headers, method):
        self.host = host.decode('utf-8')
        self.hostname = socket.gethostbyname(self.host)
        self.port = port
        self.path = path.decode('utf-8')
        self.header = headers
        self.method = method.decode('utf-8')
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

Хост и порт анализируются из библиотеки urlparse

def from_url(cls, url, header, method):
        """Construct a request for the specified URL."""
        res = urlparse(url)
        path = res.path
        if res.query:
            path += b'?' + res.query
        return cls(res.hostname, res.port or 80, path, header, method)

1 Ответ

1 голос
/ 13 июля 2020

create_connection - это функция в модуле socket, а не метод класса socket.socket.

Более того, create_connection возвращает a socket.socket экземпляр, поэтому вместо того, чтобы создавать его в __init__, вы должны установить self.sock на какое-то «неинициализированное» значение (например, None) в __init__ и назначить новый экземпляр socket.socket в _connect:

Замените

def __init__(self, …):
    # …
    self.sock = socket.socket(…)

def _connect(self):
    # …
    self.sock.create_connection((self.hostname, self.port))

на

 def __init__(self, …):
     # …
     self.sock = None

 def _connect(self):
     # …
     self.sock = socket.create_connection((self.hostname, self.port))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...