2016-02-27 61 views
1

多個客戶端我想在python構建一個簡單的socket服務器:接受在python socket服務器

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") 

socket服務器應該同時接受多個客戶端。我試圖從我的外殼由多個標籤調用遠程登錄本地主機5000來測試其功能但是我得到的模式是

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

而不是

Someone Connected 
Someone Connected 
Someone Connected 

我召喚4秒內每次的內telnet命令其他所以它應該有2條連接的消息,但只有在前一個套接字斷開連接後纔會返回消息。爲什麼是這樣,我該如何去解決這個問題?

+0

您正在打印die語句而不關閉套接字。客戶端仍應該連接 –

+0

但是,爲什麼在我連接到該功能後,該功能不會打印「有人連接」?它總是等待「死」被打印? – Bula

+0

據我所知,它應該打印「連接」,然後暫停4秒,然後打印「死亡」(即使你不關閉插座)。這不是發生了什麼? –

回答

1

它是一個典型的錯誤。你叫handle()(睡眠4秒),然後嘗試從其結果創建一個線程。目標應該是一個函數引用,並且參數應該分開傳遞。

threading.Thread(target=handle, args=(s.accept(),)).start() 

在這個版本中,主線程等待一個accept,然後創建運行handle線程。

+0

很棒的回答 –