主线程中的Python套接字可以防止退出

时间:2013-03-03 19:32:48

标签: python sockets quit

我正在玩python中的套接字,只是为了了解它们。但是我对以下问题感到非常恼火:

import socket
soc = socket.socket(socket.AF_INET)
soc.bind(('localhost',8000))
soc.listen(0)
client = soc.accept()

当套接字正在等待连接时,按ctrl-c不会退出应用程序。

如何退出应用程序?

these two个问题中解决了类似的问题,但是accept方法是从一个单独的线程调用的,问题是如何让ctrl-c杀死该线程。这里从主线程调用accept方法。

编辑:我在Win7 64位上运行python 3.3.0。

5 个答案:

答案 0 :(得分:4)

你应该使用 CTRL + Break 。这应该会杀了它。

答案 1 :(得分:4)

我找不到使用ctrl-c或任何其他方式杀死应用程序的方法,除了通过任务管理器杀死它,所以我写了一个解决方法:

import socket,os
from threading import Thread

class socketListener(Thread):
    def run(self):
        soc = socket.socket(socket.AF_INET)
        soc.bind(('localhost',8000))
        soc.listen(0)
        client = soc.accept()

pid = os.getpid()
sl = socketListener()
sl.start()
input('Socket is listening, press any key to abort...')
os.kill(pid,9)

这会在一个单独的线程中运行脚本,同时等待主线程中的击键。一旦用户按下某个键,整个应用程序就会被终止。

答案 2 :(得分:0)

在我遇到同样的问题后发现了一些解决方法,它可能不是最干净的方式,但至少它对我有用:

import socket
from select import select

#create an INET, STREAMing socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#bind the socket to localhost
serversocket.bind(('localhost', 8000))
While 1:
    serversocket.listen(5)
    ready, _, _ = select([serversocket], [], [], 1) #Timeout set to 1 seconds
    if ready:
        (clientsocket, address) = serversocket.accept()
        #Do something with client
    else:
        #Do nothing, just loop again

通过使用select,您将等待套接字fd的更改,直到超时结束。正如我所说,这可能不是最干净的方式,但Ctrl-c将在超时结束时捕获。

可移植性警报:在Unix上,select适用于套接字和文件。在Windows上,select仅适用于套接字。

答案 3 :(得分:0)

“ serversocket”模块提供了标准解决方案。我在Windows上测试了Control-C,它起作用了。

这是链接serversocket example

在代码的注释中甚至提到了Control-C的处理方式

# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C

这是上面链接的完整代码:

import socketserver   
class MyTCPHandler(socketserver.BaseRequestHandler):   
    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        # Activate the server; this will keep running until you
        # interrupt the program with Ctrl-C
        server.serve_forever()

如果我们想重新发明轮子,我们将在监听器套接字上执行select()或poll(),超时时间为0.5秒。

答案 4 :(得分:0)

为了节省其他人搜索此主题的时间,如果您的笔记本电脑键盘没有 break 按钮,请尝试

Ctrl + Fn + F6

Ctrl + F6