2016-01-16 3 views
0

Я написал в своей программе udp no echo server, я использовал поток для запуска и прослушивал сообщения, отправляемые другими пользователями. Но, похоже, я не мог остановить его использование tl.stop(), когда я ввожу q или quit. Некоторые из моего кода заключается в следующем:Как остановить udp-сервер в потоковом режиме?

  class treadListen(threading.Thread): 
       def __init__(self): 
        self.running = True 
        threading.Thread.__init__(self) 

       def run(self): 
        address = ('localhost', 16666) 
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
        sock.bind(address) 
        while True: 
         data = sock.recv(65535) 
         print "MESSAGE:{0}".format(data) 
        sock.close() 

       def stop(self): 
        self.running = False 
       # end of class thread_clock 


      if __name__ == "__main__": 
       tl = treadListen() 
       tl.start() 

       while True: 
        message = raw_input("CMD>") 
        if not message: 
         print "Please input command!" 
         continue 
        elif (message == 'quit') or (message == 'q'): 
         tl.stop() 
         break 
        else: 
         print "input is {0}".format(message) 
         # do something 
         continue 
       print "[CONNECTION CLOSED!]" 

Я пытался добавить sock.shutdown(socket.SHUT_RDWR) и sock.close() в DEF остановку класса, но он не работает. Как я могу остановить безопасность потока? Благодаря!

+0

Возможный дубликат (http://stackoverflow.com/questions/1112343/how-do-i-capture-sigint- in-python) – rbp

+0

вы также неправильно понимаете 'elif',' continue' и 'break' – rbp

ответ

0

Спасибо ntki, rbp, st. Проблема решается использовать следующий код: [? Как захватить SIGINT в Python]

  class treadListen(threading.Thread): 
       def __init__(self): 
        **self.running = True** 
        threading.Thread.__init__(self) 

       def run(self): 
        address = ('localhost', 16666) 
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
        **sock.settimeout(1)** 
        sock.bind(address) 
        **while self.running: 
         try: 
          data = sock.recv(65535) 
          print "MESSAGE:{0}".format(data) 
         except Exception, e: 
          continue** 
        sock.close() 

       def stop(self): 
        **self.running = False** 
       # end of class thread_clock 
1

Ваш цикл while while True: работает навсегда, поэтому я думаю, что ваши закрытые или закрытые вызовы в розетку никогда не смогут работать.

Вы должны изменить while True: на while self.running:, и это должно сделать трюк.

+0

Я пытаюсь использовать« во время работы: », но ничего не меняется. –

+0

Я имел в виду цикл while в классе treadListen –

+0

'self' также отсутствует. Попробуйте: 'while self.running:' в потоке. – ntki