【发布时间】:2014-12-22 20:21:44
【问题描述】:
我有一个应该接受多个客户端的服务器,但由于某种原因,当它为客户端启动一个新线程时,它不会继续 while 循环,直到客户端断开连接。
此外,while 循环停止到 select.select,并且在 sock.accept 有挂起的连接之前不会继续。在我将 self.serverstatus 值更改为 0 后,它也无法正常中断并使套接字关闭
这是服务器的代码
编辑:将包含 ct.run() 的行修复为 ct.start()
def serverstart(self):
self.buttonswitch("1")
self.host = self.intip
self.port = 5000
s = socket.socket(socket.AF_INET6)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((self.host, self.port))
inputs = [ s ]
s.listen(5)
self.serverstatus = "1"
while True:
inputready, outputready, exceptready = select.select(inputs, [], [])
if inputready != " " and self.serverstatus == "1":
c, addr = s.accept()
ct = threading.Thread(target=self.client_thread, args=[c, addr])
ct.start()
elif self.serverstatus == "0":
break
s.close()
print "Closing socket"
self.buttonswitch("0")
def client_thread(self, c, addr):
print "Connection from: " + str(addr)
while True:
data = c.recv(1500)
print len(data)
if not data:
break
data = str(data).upper()
c.send(data)
if self.serverstatus == "0":
break
c.close()
【问题讨论】:
-
self.serverstatus为何以及在何处更改其值?是否也可能是 while 循环一直在循环而您却没有注意到? -
你需要调用 start 而不是在 Thread 实例上运行。
-
self.serverstatus 从按钮切换时应该改变值。我试图在while循环中打印文本以查看它是否确实循环,但由于某种原因它卡在包含“inputready,outputready,exceptready = select.select(inputs,[],[])”的行直到它它有联系。我通过在该行的顶部和下方放置一个打印行来测试它,并且只有它上面的代码被执行,直到传入的连接允许它继续。
标签: python multithreading sockets multiprocessing