Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
主线程中的Python套接字接受阻止退出_Python_Sockets_Quit - Fatal编程技术网

主线程中的Python套接字接受阻止退出

主线程中的Python套接字接受阻止退出,python,sockets,quit,Python,Sockets,Quit,我正在使用python中的套接字,只是为了了解它们。然而,我对以下问题感到非常恼火: import socket soc = socket.socket(socket.AF_INET) soc.bind(('localhost',8000)) soc.listen(0) client = soc.accept() 当套接字等待连接时,按ctrl-c不会退出应用程序 如何退出应用程序? 问题中也提到了类似的问题,但是从一个单独的线程调用了accept方法,问题是如何使ctrl-c杀死该线程。这里

我正在使用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。

您应该使用CTRL+Break。这应该会杀死它。

除了通过任务管理器杀死应用程序之外,我找不到使用
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)

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

在遇到同样的问题后,我找到了一些解决办法,这可能不是最干净的方法,但至少对我来说是有效的:

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
通过使用
选择
,您将等待插槽fd上的更改,直到超时结束。正如我所说的,这可能不是最干净的方法,但是在超时结束时将捕获Ctrl-c

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

服务器套接字模块提供标准解决方案。我在Windows上测试了Control-C,它成功了

这是链接,

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

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

Ctrl + Fn + F6


我从来没有这个问题。这是什么环境?编辑以添加环境如何从cmd运行它?如果你制作了一个严格包含你发布的内容的脚本,
ctrl-c
是否有效?我制作了一个严格包含我发布内容的脚本,并尝试从cmd和python idle运行它。两者都不响应
ctrl-c
。我的笔记本电脑键盘上没有
break
,但我刚刚发现
ctrl-F6
在python空闲模式下工作。它重新启动shell,这会终止应用程序,但它的缺点是重置所有变量。使用
ctrl-c
可以选择检查不同变量的值,这有助于调试。更正:重新启动shell不会终止应用程序。它一直在后台运行,我需要通过任务管理器终止它。没有更好的方法吗?
Ctrl + F6