2013-08-30 4 views
1

У меня есть этот простой серверный скрипт. Моя цель для этого сценария:Python Socket (простой серверный скрипт)

  1. Дождитесь подключениями клиента
  2. не получающих массажа от клиента до отсоединения клиента
  3. После отключения клиента, ждать другого клиент для подключения
  4. не получают массаж до клиента отключить
  5. Repeat ...

import socket 

server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
server_socket.bind(("",5000)) 
server_socket.listen(5) 
print "Awaiting Client connection" 
client_socket, address =server_socket.accept() 
print "Connection established.. with ",address 
while True: 
    data=client_socket.recv(512) 
    if not data: 
     client_socket.close() 
     print "Client disconnected, Awaiting new connections..." 
     client_socket, address =server_socket.accept() 
     print "Connection from ",address 
    else: 
     print "RECIEVED:",data 

Мой вопрос даже при том, что сценарий, кажется, работает, когда я протестировать его на пару ПК, я заметил, что после того, как он получил сообщение от клиента, то есть line no 7

print "Connection established.. with ",address 

окно оболочки python кажется невосприимчивым (не реагируйте, если я пытаюсь переместить окно оболочки), пока клиент не отправит какое-либо сообщение.

Насколько я понимаю, если от клиента нет входящего сообщения, client_socket.recv(512) будет просто ждать данных от клиента.

Но почему это стало неактуальным? Для того, чтобы прояснить ситуацию,

-The скрипт работает нормально (это получить данные и распечатать его с экрана & ожидания для нового соединения, если разъединение клиента)

-The курсора в консоли окна перестанут мигать

-когда я пытаюсь переместить окно консоли вокруг, он перестает отвечать на запросы и окна дают мне сообщение «эта программа не отвечает»

+0

Параметр 'метод recv' блокирует - см http://stackoverflow.com/questions/9770567/python-tcp-socket-blocks-on-recv-method. – leon

ответ

1

в принципе, вы скриптовые блоки на accept вызов, который присутствует после этой строки:

print "Client disconnected, Awaiting new connections..." 

Звонок accept будет возвращен только тогда, когда конкретный клиент попытается подключиться к серверу. Это значит, что ваш скрипт продолжит выполнение следующей строки. Именно по этой причине вы увидите сообщение, подобное Эта программа не отвечает в Windows.

Вы можете рассмотреть возможность использования неблокирующего сокета ввода-вывода для обеспечения того, чтобы ваш скрипт был отзывчивым.

См. Ссылку this для описания блокирующих и неблокирующих вызовов. Также вы можете обратиться к вопросу this, чтобы понять, как реализовать неблокирующие сокеты в Python - и, конечно же, есть много веб-ресурсов.

Надеется, что это помогает

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