我正在尝试用Python编写一个简单的多线程Web服务器。 当新的客户端套接字与服务器套接字连接时,我创建了一个新的线程来处理客户端套接字,如下所示:
(clientsock, (ip, port)) = self.sock.accept()
newthread = ClientThread(ip, port, clientsock)
newthread.start()
其中ClientThread类有一个run方法,该方法又调用以下代码:
data_string = ''
bytes = self.socket.recv(2046)
bytes_str = bytes.decode('UTF-8')
data_string += bytes_str
其中self.socket是上面引用的clientsock。
此代码按预期工作:当服务器套接字从客户端套接字接受连接并接收客户端套接字请求时,创建1个线程。
但是如果我更改上面的代码以便在有更多数据时循环,例如:
data_string = ''
bytes = self.socket.recv(2046)
while len(bytes) > 0:
bytes_str = bytes.decode('UTF-8')
data_string += bytes_str
print 'data received: %s' % (bytes_str)
bytes = self.socket.recv(2046)
然后我有一个奇怪的问题。似乎多次调用accept,从而每次都创建一个新的,不必要的线程。
I.E - 如果我启动客户端并尝试访问文件,我会从服务器获得以下输出:
We have accepted a connection from (127.0.0.1, 59983) New thread started for (127.0.0.1, 59983) We have accepted a connection from (127.0.0.1, 59984) New thread started for (127.0.0.1, 59984)
如果只有一个客户端连接到服务器,为什么接受多次调用?
修改 这是预期的行为吗?