1

サーバーソケットを使用する単純なサーバープログラムが同時に複数のクライアントを同時に処理できるのは本当に可能でしょうか? 複数のクライアントを処理する必要があるサーバー プログラムを作成しています。同じポート番号で。しかし問題は、プログラムが一度に 1 つのクライアントにしかサービスを提供しないことです。他のクライアントにサービスを提供するには、最初の接続を終了する必要があります。

コードは次のとおりです。

try{

        ServerSocket server = new ServerSocket(PORT);
        System.out.println("Server Running...");
        while(true){
            Socket socket = server.accept();
            System.out.println("Connection from:"+socket.getInetAddress());
            Scanner in = new Scanner (socket.getInputStream());
            PrintWriter output = new PrintWriter(socket.getOutputStream());
        }
    }catch(Exception e){
        System.out.println(e);
    }

プログラムが複数のクライアントに同時にサービスを提供するために、ここに追加される可能性のある Java コードはありますか?

4

1 に答える 1

1

投稿したコードは、実際にはクライアント接続で何もしていないため、役に立ちません。しかし、はい、サーバーが複数の同時接続を処理することは完全に可能です。

私の推測では、問題は、同期 IO を使用して単一のスレッドですべてを実行していることです。つまり、既存のクライアントからのデータを待っている間は、新しい接続を受け入れていません。通常、サーバーは次の 2 つの方法のいずれかを取ります。

  • スレッドが接続を受け入れたときにスレッドを開始 (またはスレッド プールからスレッドを再利用) し、そのスレッドがその接続を排他的に処理できるようにする。
  • 非同期 IO を使用して、単一のスレッド (または少数のスレッド) ですべてを実行します。

後者のアプローチはより効率的ですが、かなり複雑です。最初は「接続ごとのスレッド」アプローチを使用することをお勧めします。Thread実験中は、クライアントが接続するたびにまったく新しいものを開始できますが、本番環境で使用する場合はExecutorService、スレッドを再利用するために または類似のものを使用します。

構築しているサーバーの種類によっては、これらすべてがサードパーティのライブラリで十分に行われる場合があることに注意してください。

于 2013-09-16T05:46:23.067 に答える