2010-01-20 3 views
1

У меня есть скрипт, который подключается к удаленному серверу. Код нижеСокеты Python, как избежать бесконечных циклов и исключений дескриптора

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((remote_host,remote_port)) 
s.setblocking(False) 


while True: 
    try: 
     data = s.recv(1024) 

     if not data: 
      break 

     pkt_type = ord(data[2]) # get pkt type 

     if pkt_type == Reset: 
      s.send(data) 

     if pkt_type == Authenticate: 
      processAuthenticate(s,data) 
      break 

    except: 
     pass 

while(True) 
. 
. 
. 

Я жду сброса и эхо обратно на сервер, а затем ждать пакета Authenticate, поворачивающих несколько бит и эхо его обратно на сервер. Как только это будет выполнено, я могу теперь запрашивать данные с сервера. Это делается в следующем цикле while (true).

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

Благодаря

+0

Не могли бы вы вставить полный код – Kimvais

ответ

0

EDIT: выглядит как FSM должно быть удобно здесь.

На самом деле, я предлагаю вам взглянуть на Twisted Reactor - я еще не использовал его (пока), но он выполняет всю большую работу и неприятные вещи, которые вам придется реализовать самостоятельно, если вы используете FSM и событие цикл (который ваш while -loop по существу есть)

EDIT 2:

несколько замечаний (в то время как в ожидании вашего полного кода)

  1. тот факт, что йо и есть 2 последовательных while(true), хорошо, нечетные
  2. вы, вероятно, хотите переместить except: заявление вверх, прежде чем if not data заявление и заменить pass с continue
  3. ord(data[2]) наводит на мысль, что вы используете двоичный протокол, вы действительно должны рассмотреть возможность использования модули structunpack() и pack().
+0

Спасибо, У вас есть пример использования FSM с сокетами или вы можете указать мне в правильном направлении? – mikip

+0

Спасибо, но я начинающий питон и хотел бы использовать стандартную библиотеку и сокет библиотеки для этого. У меня есть работа, но не очень элегантная. Я как бы на крутой кривой обучения, так как раньше не использовал сокеты, и только начинаю изучать python. – mikip

+0

Спасибо за совет. Это, по сути, полный код, остальная часть этого не имеет особого значения. Когда вы говорите, переместите оператор except вверх, вы имеете в виду перед операцией «if not data:». Причина, по которой я использовал «проход», - это то, что я знаю, что что-то должно идти здесь, но я не знаю, что? – mikip

1

Конечный автомат (FSM) - это в значительной степени канонический способ делать подобные вещи. Хорошей ссылкой для выполнения FSM в Python является следующее: http://wiki.python.org/moin/FiniteStateMachine

0

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

+0

Спасибо, я не знал, что – mikip

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