Я пытаюсь выучить питон, выполняю упражнения, смотрю видео онлайн.В настоящее время я пытаюсь создать многопоточный сервер чата, но мне трудно понять, как работают потоки.
Вот мой код:
<!-- language: lang-py -->
import socket
import threading
class ThreadedServer(threading.Thread):
def __init__(self, host, port, buff_size):
threading.Thread.__init__(self)
self.host = host
self.port = port
self.buff_size = buff_size
self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.host, self.port))
def listen(self):
self.sock.listen(5)
while True:
print('Waiting for a connexion...')
self.c, self.addr = self.sock.accept()
listening = listenToClient(self.c, self.addr)
class listenToClient(threading.Thread):
def __init__(self, client, address):
threading.Thread.__init__(self)
global socks
socks.append(client)
client.send(("Bienvenue sur le serveur, entre ton pseudo: ").encode('utf-8'))
self.name = client.recv(buff_size).decode('utf-8')
welcome = "Welcome " + self.name + "! If ever you want to quit, type {quit}"
client.send(welcome.encode('utf-8'))
msg = self.name + " has joined the chat"
broadcast(msg)
while True:
msg = client.recv(buff_size).decode('utf-8')
if msg != '{quit}':
broadcast(msg, self.name + ": ")
print('TEST6')
else:
client.close()
leave_msg = self.name + " has left"
broadcast(leave_msg)
break
def broadcast(msg, prefix=''):
for sck in socks:
content = prefix + msg
sck.send(content.encode('utf-8'))
def Main():
ThreadedServer(host,port,buff_size).listen()
host = '127.0.0.1'
port = 10000
buff_size = 1024
socks = []
if __name__ == '__main__':
Main()
Код работает нормально длятолько один пользователь.Я думаю, что проблема в моем понимании потоков.По-моему, когда я набираю
listening = listenToClient(self.c, self.addr)
, создается новый поток, работающий параллельно с первым.На самом деле я вижу, что мой новый поток действительно выполняется и заканчивается здесь бесконечным циклом (управляет тем, что набирает мой первый подключенный пользователь):
while True:
msg = client.recv(buff_size).decode('utf-8')
if msg != '{quit}':
broadcast(msg, self.name + ": ")
print('TEST6')
Но я думал, что исходный поток будет иметьпродолжение цикла здесь:
while True:
print('Waiting for a connexion...')
self.c, self.addr = self.sock.accept()
listening = listenToClient(self.c, self.addr)
Печать «Ожидание соединения» и ожидание второго соединения.Но это не тот случай.
Я почти уверен, что это недоразумение с моей стороны, я потратил часы, пытаясь изменить все и т. Д., В какой-то момент поток listenToClient()
был просто методом в ThreadedServer()
.Но сейчас я очень растерялся и не знаю, что делать, поэтому я пришел сюда за помощью.
Заранее спасибо,
Винсент