2013-03-03 55 views
0

我正在玩python中的套接字,只是为了了解它们的目的。但是我用下面的问题确实恼火:在主线程中的Python套接字接受可以防止退出

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

而插座正在等待连接,按下Ctrl-C不退出应用程序。

我该如何退出应用程序?

类似的问题在thesetwo的问题解决了,但是那里的accept方法被调用从一个单独的线程,问题是如何使CTRL-C杀死该线程。这里的accept方法是从主线程调用的。

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

+0

我从来没有这个问题。这是什么环境? – cnicutar 2013-03-03 19:35:59

+0

编辑添加环境 – Joe 2013-03-03 19:37:40

+0

如何从cmd运行它?如果你制作一个包含**的脚本,严格按照你发布的内容**,“ctrl-c”是否有效? – cnicutar 2013-03-03 19:38:28

回答

3

我无法找到一个方法来杀死使用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) 

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

+0

有没有更好的办法? – Nirri 2017-11-25 01:26:01

3

您应该使用CTRL + 中断。这应该杀死它。

+0

我的笔记本电脑键盘上没有“break”,但我只是发现'ctrl-F6'在python空闲中工作。它会重新启动shell,这会杀死应用程序,但它具有重置所有变量的缺点。通过'ctrl-c',可以选择检查不同变量的值,这有助于调试。 – Joe 2013-03-03 19:48:23

+0

更正:重新启动shell不会**杀死应用程序。它一直在后台运行,我需要通过任务管理器来杀死它。 – Joe 2013-03-05 04:47:10

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仅适用于套接字。