これは私のサーバー - クライアントチャットプログラムのクライアントコードですが、このプログラムを閉じるときに、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()
名前のつけられていない 'except:'(別名naked 'except')が一般的に悪い考えであり、' except:pass'がなぜそうであるかの古典的な例です。 –
また、 'receive'関数' receiving'はローカルですが、ループは決して終了しないように、他のものに設定されることはありません。さらに悪いことに、あなたのソケットはノンブロッキングなので、これは本質的にCPUを消費するビジーなループです。 – mata