2016-10-01 3 views
0

これは私のサーバー - クライアントチャットプログラムのクライアントコードですが、このプログラムを閉じるときに、qという文字を送信すると、単に動作しません。それは端末に詰まり、何かを待つ。PythonプログラムがCtlr + dまたはCtrl + cで中断しないのはなぜですか?

ここで何が間違っていましたか?サーバー・コードを見ることに興味を持っている場合には

import socket 
import threading 
import time 

receiving = False 
lock = threading.Lock() 

def receive(name, sock): 
     receiving = True 
     while receiving: 
       try: 
         lock.acquire() 
         while True: 
           data, address = sock.recvfrom(1024) 
           print str(data) 
       except: 
         pass 
       finally: 
         lock.release() 

host = 'localhost' 
port = 0 
server = ('localhost', 7787) 

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.bind((host, port)) 
s.setblocking(0) 

receiveThread = threading.Thread(target=receive, args=("receiveThread", s)) 
receiveThread.start() 

username = raw_input("Name: ") 
message = raw_input(username + "-> ") 

while True: 
     if message == 'q': 
       receiving = False 
       receiveThread.join() 
       s.close() 
       break 
     if message != '': 
       s.sendto(username + ": " + message, server) 
     lock.acquire() 
     message = raw_input(username + "-> ") 
     lock.release() 
     time.sleep(0.2) 

、ここにある:

import socket 
import threading 
import time 

host = 'localhost' 
port = 7787 

running = False 

MAX_PACKET_SIZE = 1024 
clients = [] 

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.bind((host, port)) 
s.setblocking(0) 


running = True 
print "server started..." 

while running: 
     try: 
       data, address = s.recvfrom(MAX_PACKET_SIZE) 
       if 'quit' in str(data): 
         running = False 
         print 'server stopped...' 
       if address not in clients: 
         clients.append(address) 

       print time.ctime(time.time()) + str(address) + ": :" + str(data) 
       for client in clients: 
         s.sendto(data, client) 
     except: 
       pass 

running = False 
s.close() 
+3

名前のつけられていない 'except:'(別名naked 'except')が一般的に悪い考えであり、' except:pass'がなぜそうであるかの古典的な例です。 –

+0

また、 'receive'関数' receiving'はローカルですが、ループは決して終了しないように、他のものに設定されることはありません。さらに悪いことに、あなたのソケットはノンブロッキングなので、これは本質的にCPUを消費するビジーなループです。 – mata

答えて

3

あなたはすべてのものの上にexceptsで例外ブロックを持っているので。この場合、キーボード割り込みを受け取り、終了呼び出しを無効にします。

おそらくKeyboardInterruptのために別のcatchブロックを追加する必要があります

except KeyboardInterrupt: 
    raise 
+0

@joojaaなので、この例外のみを発生させて他のすべてを渡すにはどうすればよいですか? –

+0

@Zaiこれをexcept:Pass文の前に追加すると、他のものをキャッチしてキーボード割り込みを発生させます。 – joojaa

+0

http://effbot.org/zone/stupid-exceptions-keyboardinterrupt.htm – joojaa

0

PythonのCTRL + CではKeyboardInterrupt例外をトリガーするためにスローされます。これにより、プログラムを正常にシャットダウンすることができます。

関連する問題