2017-04-15 148 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) 

但一個KeyboardInterrupt是沒有抓到,因爲它發生在socket.timeout異常處理程序內。 這是按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異常?

我的環境是Windows 7P + SP1 x64,Python 3.5.2 32b。

由於提前,

JM

回答

1

的問題是不是套接字超時。問題在於你期待拋出異常。將代碼更改爲:

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

相關問題