1

私はリクエストを待っていくつかのデータを返すpythonデーモンを書いています。しかし、クライアントがスクリプトを要求すると、デーモンはその作業を停止しました。これがコードです

......
def run(self):
    while True:
        server_socket  = socket.socket()         # Create a socket object
        host = socket.gethostname() # Get local machine name
        port = 12345                # Reserve a port for your service.
        server_socket .bind((host, port))        # Bind to the port
                server_socket .listen(5)   

        client_socket, address  = server_socket.accept()    
 # Establish connection with client.

        print 'Got connection from', address 
        logging.info(address)
        #data = client_socket.recv(2048) 
        data = client_socket.recv(1024)
        logging.info(data)
......
4

1 に答える 1

1

あなたが本当にサーバー機能になりたいかどうかはわかりませんが、あなたの例に基づいて、一度に1つのクライアントを受け入れて処理できるサーバーがあります。私が提案するのは、接続のたびに毎回サーバーを再バインドすることではありません。それは必要ない。

ソケットを 1 回バインドしてから、クライアントを待機するループに入ります。

def run(self):
    server_socket = socket.socket()         
    host = socket.gethostname() 
    port = 12345               
    server_socket.bind((host, port))        
    server_socket.listen(5)   

    while True:
        # this will block until a client tries to connect
        client_socket, address  = server_socket.accept()    

        print 'Got connection from', address 
        logging.info(address)
        # this will block until data is received from client
        data = client_socket.recv(1024)
        logging.info(data)

ここで何が起こるかというと、サーバーはクライアントを受け入れ、クライアントが何かを送信するのを待っている間にブロックします。その後、新しいクライアントを待って再びループします。1 回限りの接続で、処理が完了した場合は、そのソケットを閉じることもできます。

同時に複数のクライアントを処理できるようにする場合は、メイン スレッドでループを実行し、新しい接続をそれぞれワーカー スレッドに渡して通信を処理します。これにより、メイン スレッドが解放され、ループを続行し、新しいクライアントが接続されるのを待ちます。

これは、クライアントごとに新しいスレッドを開始してソケットを渡すか、Queue実行中のスレッドの固定プール間で共有を使用することで実現できます。各スレッドは、キューからアイテムを取得するのを待ってから、ソケット アイテムの通信ループに入ります。完了すると、キューでの待機に戻ります。

擬似コードは次のようになります。

socket_queue = Queue()
...
def main_server_thread():
    while True:
        # this will block until a client tries to connect
        client_socket, address  = server_socket.accept()    

        print 'Got connection from', address 
        logging.info(address)

        # this will finish right away and loop again
        socket_queue.put(client_socket)
...
def client_worker_thread():
    while True:
        sock = socket_queue.get()
        while sock is still connected:
            data = sock.recv(1024)
            logging.info(data)                
于 2012-11-17T20:30:18.927 に答える