0

クライアントがこのサーバーに接続するまでwhileループを停止する方法はありますか? サーバは新しいクライアント接続ごとに新しいスレッドを作成しますが、それは可能ですか?Pythonソケットがクライアント接続を待機する

import socket 
import threading 

def clientdialog(myS): 
    conn, addr = myS.accept() 
    print ("Connection from: " + str(addr)) 

    while 1: 
       data = conn.recv(1024).decode("utf-8") 
       if not data or data == 'q': 
        break 
       print ("from connected user: " + str(data)) 

host = "192.168.1.3" 
port = 1998 

mySocket = socket.socket() 
mySocket.bind((host,port)) 

while True: 

    mySocket.listen(10) 
    #whait until socket don't connect 

    try: 
     threading._start_new_thread(clientdialog, (mySocket)) 
    except: 
     print("error starting thread") 

答えて

2

socket.listen機能は、それが接続キューのサイズを設定しているため、一度呼び出されます。

socket.acceptという別の機能は、接続が確立されるまでブロックします。次のようにコードを変更してください。

mySocket = socket.socket() 
mySocket.bind((host,port)) 
mySocket.listen(10) 

while True: 
    client_socket, client_address = mySocket.accept() # blocking call 
    .... # do something with the connection 

詳細については、docsをご覧ください。

さらに、クライアントソケットの詳細をスレッドに渡したいとします。サーバーソケットは不要です。実際には、次のようなものがあります。

def handle_client(client_socket, client_address): 
    .... # do something with client socket 
    client_socket.close() 

... 

while True: 
    client_socket, client_address = mySocket.accept() 
    T = threading.Thread(target=handle_client, args=(client_socket, client_address)) 
    T.start() 

メインループで接続を受け入れ、処理のためにクライアントの詳細をスレッドに渡します。

+0

スレッド部分は機能しませんが、ブロックコールは完全に機能します。 – Racerider

+0

@Racerider嬉しいです。私がここに書いたコードは代表的な例です。いくつかの追加があればうまくいくはずです。ではごきげんよう。 –

関連する問題