我正在尝试学习python,并在网上练习观看视频。我目前正在尝试制作多线程聊天服务器,但我认为我在理解线程工作方式方面遇到困难。
这是我的代码:
return value(new CollectionEngine(collect($data), new DatatablesRequest()))
->setTotalRecords($total)
->make(true);
该代码仅对一个用户有效。 我认为问题出在我对线程的理解上。 在我的脑海中,当我输入
<!-- 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()
中的一种方法。但是现在我很迷茫,我不知道该怎么办,所以我来到这里寻求帮助。
预先感谢
Vincent