2

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

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

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

如何退出应用程序?

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

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

4

5 回答 5

6

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

于 2013-03-03T19:40:28.353 回答
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)

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

于 2013-03-09T15:27:32.340 回答
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仅适用于套接字。

于 2018-02-07T15:38:04.203 回答
0

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

这是链接,serversocket 示例

代码注释中甚至提到了 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 秒。

于 2020-08-05T12:37:17.587 回答
0

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

Ctrl + Fn + F6

或者

Ctrl + F6
于 2021-02-25T06:25:46.017 回答