2017-08-27 1 views
0

最近、Pythonの退屈に陥った後、私はPythonでソケットプログラミングを学ぶことに決めました。それはかなりうまく行きました、私はTCP接続を確立することができました。コード全体を一時停止することなく、サーバーへのクライアント接続をリスンすることは可能ですか?

その後、私はGUIをコードに追加してより良いものにし始めました。その問題は、関数s.listen()を呼び出すと、クライアントが接続するまでコード全体が一時停止し、GUIモジュール(Pygame)では受け入れられず、遅延が発生し、イベント処理ループが崩壊するためです。だから私はクライアントが私のサーバーに接続している場合は、ループ全体を一時停止せずにチェックのいくつかの他の方法があるのだろうかと思っていた。

私はマルチスレッドしてみてくださいでした:

#Wait for Connection then accept 
Connection = False 
def a(): 
    global Connection 
    text = 'waiting for connection' 
    while Connection==False: 
     print(text) 
     time.sleep(1) 
     if text == 'waiting for connection...': 
      text = 'waiting for connection' 
     else: 
      text = text+'.' 
def b(): 
    global Connection 
    s.listen(1) 
    print("con") 
    Connection=True 

WaitScreen = threading.Thread(target=a) 
WaitClient = threading.Thread(target=b) 
WaitScreen.start() 
WaitClient.start() 

しかし無駄に。

ご意見がありましたらお知らせください。スタックオーバーフローは私の最後の手段です。私はGoogleと私が持っているすべての本のいたるところを見てきました。多分、コード全体を一時停止するのではなく、クライアントが接続しようとしているときにtrueを返す関数。何でも大歓迎です。

ありがとうございました

+0

はい、可能ですソケットと非ブロックソケットオプションとselect関数:ノンブロッキングソケットを参照してください。https://docs.python.org/2/howto/sockets.html David Beazleyもここで興味深い概念をカバーしています:https://www.youtube.com /時計?v = MCs5OvhV9S4 –

答えて

0

ブロッキングソケットを使用していてもスレッドが動作します。以下の例では、サーバースレッドは接続の待機をブロックし、クライアントスレッドはデータの受信待機をブロックしますが、メインプログラムは継続して実行されます:

#!python3.6 
import threading 
import socket 
import time 

def server(): 
    s = socket.socket() 
    s.bind(('',8000)) 
    s.listen(1) 
    while True: 
     conn,addr = s.accept() # will block here until client connects 
     t = threading.Thread(target=client,args=(conn,addr),daemon=True) 
     t.start() 

def client(conn,addr): 
    print(addr,'connected') 
    while True: 
     data = conn.recv(1024) # will block here waiting for data 
     if not data: 
      break 
     print('got:',data) 
    print(addr,'disconnected') 
    conn.close() 

server = threading.Thread(target=server,daemon=True) 
server.start() 
i = 0 
# This will keep running 
while True: 
    print('-\|/'[i%4],end='\r',flush=True) 
    time.sleep(.1) 
    i += 1 
関連する問題