主线程中的Python套接字接受阻止退出
我正在使用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杀死该线程。这里
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