如何在Python中使用ctrl+c停止服务器套接字



当我运行服务器时,当服务器正在侦听时,没有办法停止服务器而不是关闭终端。我试图处理ctrl+c使用KeyboardInterrupt,但它不起作用。我可以终止脚本使用ctrl+break,但我不知道如何处理它在我的代码。

下面是我的服务器的代码:
import socket

try:
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listener.bind(('127.0.0.1', 4444))
listener.listen(0)
print('Listening...')
listener.accept()
print('Got a connection.')
except KeyboardInterrupt:
print('Exiting...')
exit()

我怎么能处理ctrl+break在我的代码?

如果没有客户端在等待,socket.accept()挂起直到连接建立,并且不能通过CTRL-CCTRL-BREAK来中断。使用select.select()等待可从服务器套接字读取的连接以及超时。超时将允许CTRL-CCTRL-BREAK被识别。

CTRL-C引发KeyboardInterrupt,但CTRL-BREAK需要一个信号处理程序。我在下面的SIGBREAK信号上设置了一个自定义异常:

import signal
import socket
import select
# Custom exception with same base class as KeyboardInterrupt
class CtrlBreakInterrupt(BaseException):
pass
def handler(*args):
raise CtrlBreakInterrupt
signal.signal(signal.SIGBREAK, handler)
# Set up server
with socket.socket() as sock:
sock.bind(('', 5000))
sock.listen()
# Loop, accepting one connection at a time.
while True:
try:
# Check server has a connection with timeout
readable, _, _ = select.select([sock], [], [], 1.0)
if sock in readable:
with sock.accept() as (client, address):
while True:
data = client.recv(4096)
if not data: break
print(data)
except CtrlBreakInterrupt:
print('CTRL-BREAK')
break
except KeyboardInterrupt:
print('CTRL-C')
break

就像这样。

def handler(signum, frame):
print 'Shutting down...'
sys.exit(1)

signal.signal(signal.SIGTERM, handler)
while True:
clientsocket, address = listener.accept()
clientsocket.send(bytes("hi.","utf-8"))

相关内容

最新更新