在 Python 套接字服务器中接受多个客户端连接

3

我正试图在Python中构建一个简单的套接字服务器:

import socket
import threading
import time


def handle(conn_addr):
  print("Someone Connected")
  time.sleep(4)
  print("And now I die")


host = ''
port = 5000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
  s.bind((host,port))
except socket.error as e:
  print(str(e))

s.listen(2)

while True:
  threading.Thread(handle(s.accept())).start()


print("Should never be reached")

套接字服务器应该能够同时接受多个客户端。我尝试通过从我的 shell 中的多个选项卡调用 telnet localhost 5000 来测试其功能,但我得到的模式是

Someone Connected
And now I die
Someone Connected
And now I die

而不是

Someone Connected
Someone Connected
Someone Connected

我连续在4秒内调用telnet命令,因此应该连续返回2个连接消息,但是只有在前一个socket断开连接后才会返回消息。为什么会这样,我该如何解决?


1
你正在打印未关闭套接字的指令。客户端应该仍然保持连接。 - OneCricketeer
但是为什么当我连接到它时,该函数为什么不会立即打印“someone connected”呢? 它总是等待“die”被打印吗? - Bula
据我所知,它应该打印“connected”,然后暂停4秒,然后打印“die”(即使您没有关闭套接字)。这不是正在发生的吗? - OneCricketeer
1个回答

4
这是一个经典的错误。您调用了 handle()(它睡了4秒钟),然后尝试从其结果创建线程。目标应该是函数引用,并且需要单独传递参数。
threading.Thread(target=handle, args=(s.accept(),)).start()

在这个版本中,主线程等待 accept,然后创建运行 handle 的线程。

这帮助我们在Python中为事件socket.recv(1024)创建委托,@tdelaney,您想对此提供反馈吗?谢谢。 - Arsalan Saleem
@ArsalanSaleem - 我不确定这会怎么样。Thread(target=mysock.rec, args=(1024,)).start()会有问题。接收到的数据会去哪里?recv可能会获得从0到1024字节的任何内容(套接字关闭为0,或者由于它是面向字节的,只有部分消息),并且可能会出现异常。我需要了解细节才能知道。...而且在此处进行评论将很难。也许需要一个新的问题,或者在https://codereview.stackexchange.com上发表一些东西? - tdelaney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接