2016-02-27 2 views
1

Я пытаюсь создать простой сокет-сервер в 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") 

Сервер сокета должен принимать несколько клиентов одновременно. Я пытался проверить его функциональность с помощью вызова телнета Localhost 5000 из нескольких вкладок из моей оболочки, однако шаблон, который я получаю

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

Вместо

Someone Connected 
Someone Connected 
Someone Connected 

я назвать команду TELNET в течение 4 секунд каждого другой, поэтому он должен иметь 2 сообщения подключенного в строке, однако сообщение возвращается только после отсоединения предыдущего сокета. Почему это и как я могу это исправить?

+0

Вы печатаете инструкцию для штампа без закрытия розетки. Клиенты все равно должны быть подключены –

+0

Но почему функция не печатает «кто-то связан», как только я подключаюсь к ней? Он всегда ждет, чтобы «умереть» было напечатано? – Bula

+0

Насколько я могу судить, он должен печатать «подключен», а затем останавливаться на 4 секунды, а затем печатать «умереть» (даже если вы не закрываете сокет). Разве это не то, что происходит? –

ответ

1

Его классическая ошибка. Вы вызвали handle() (который спал в течение 4 секунд), а затем попытались создать поток из его результата. Цель должна быть ссылкой на функцию, а аргументы должны передаваться отдельно.

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

В этой версии, основной поток ожидает для accept, а затем создает поток, который проходит handle.

+0

Отличный ответ –

Смежные вопросы