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です。事前に
おかげで、
ありがとうございました。 – jmatos