Потеря аргумента в функции класса
Пишу программу, передающую данные между программой клиент сервер. Но у меня где теряется аргемент при вызове функции класса, не могу понять где.
TypeError: listen_user() missing 1 required positional argument: 'user'
Вот код сервера:
import socket
import threading
class Server():
def __init__(self):
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind(('127.0.0.1', 1234))
self.server.listen(5)
print('Server is listening')
self.users = []
def send_all(self, data):
for user in self.users:
user.send(data)
def listen_user(self, user):
print('Listening user')
while True:
data = user.recv(2048)
print(f"User sent <{data}>")
Server.send_all(data)
def start_server(self):
while True:
user_socket, address = self.server.accept()
print(f"User {address[0]} connected")
self.users.append(user_socket)
listen_accepted_user = threading.Thread(
target=Server.listen_user,
args=(user_socket, )
)
listen_accepted_user.start()
if __name__ == '__main__':
my_server = Server()
my_server.start_server()
Ответы (2 шт):
Автор решения: CrazyElf
→ Ссылка
def listen_user(self, user):
...
target=Server.listen_user
Метод listen_user запустится в отдельном потоке как метод класса, а не метод экземпляра класса, поэтому параметр self в её описании не нужен (он и не используется в этой функции). Исправьте:
def listen_user(user):
Автор решения: eri
→ Ссылка
В вашем коде в куче мест надо заменить Server.foo() на self.foo() чтоб обратиться к экземпляру. А обращаясь к экземпляру передается он сам в self. Обращаясь к типу класса экземпляр не передается.