2013-03-03 53 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僅適用於套接字。