我正在玩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。
答案 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,它起作用了。
在代码的注释中甚至提到了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