2017-04-15 103 views
1

私は非ブロック受け入れ(settimeoutを使用)を持つ単純なソケットサーバーを開発しようとしていますが、Ctrl-C(KeyboardInterrupt)を使用して停止できるようにしたいと考えています。socket.timeout例外ハンドラ内からKeyboardInterruptをキャッチする方法は?

私のコードはこれです:

import socket 

host = '127.0.0.1' 
port = 5000 

s = socket.socket() 
s.settimeout(1) 
s.bind((host, port)) 
s.listen(1) 
print('Server started') 
while True: 
    try: 
     conn, addr = s.accept() 
    except socket.timeout: 
     pass 
    except Exception as exc: 
     print(str(exc)) 
     print('Server closing') 
     s.close() 
     break 
    except KeyboardInterrupt: 
     print('Server closing') 
     s.close() 
     break 
    else: 
     print('Connection from', addr) 

しかし、それはsocket.timeout例外ハンドラの内部で起こるので、KeyboardInterruptがキャッチされることはありません。 これは、Ctrl-Cを

c:\Users\JMatos\MEOCloud\Python>python file_server.py 
Server started 
Traceback (most recent call last): 
    File "file_server.py", line 40, in <module> 
    conn, addr = s.accept() 
    File "C:\Python35-32\lib\socket.py", line 195, in accept 
    fd, addr = self._accept() 
socket.timeout: timed out 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "file_server.py", line 40, in <module> 
    conn, addr = s.accept() 
KeyboardInterrupt 

を押すと出力がsocket.timeout例外ハンドラ内KeyboardInterrupt例外をキャッチする方法はありますか?

私のenvはWindows 7P + SP1 x64、Python 3.5.2 32bです。事前に

おかげで、

答えて

1

JM問題は、ソケットタイムアウトではありません。問題は例外がスローされることを期待しているところです。コードを次のように変更してください。

try: 
    while True: 
     try: 
      conn, addr = s.accept() 
     except socket.timeout: 
      pass 
     except Exception as exc: 
      print(str(exc)) 
      print('Server closing') 
      s.close() 
      break 
    else: 
     print('Connection from', addr) 
except KeyboardInterrupt: 
    print('Server closing') 
    s.close() 
+0

ありがとうございました。 – jmatos

関連する問題