0

彼ら!シンプルなサーバー クライアント (udp) アプリケーションを作成しました。現在、多くのクライアントを受け入れるサーバーを作成しようとしています。私が理解したように、クライアントを受け入れて処理する関数を作成する必要がありますが、アプリの構造について混乱しています。アプリに適切なスケルトンがあるかどうかを確認できますか? ヒントや例を教えてください。すべてのアドバイスに感謝します!:)

class MultiServer {

    private DatagramSocket serversocket;

    public MultiServer() {
        try {
            this.serversocket = new DatagramSocket(6789);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void start() throws IOException {
        while(true) {
            DatagramSocket serversock = serversocket.accept();
            new Thread(new ClientHandler(serversock)).start();
        }
    }

    public static void main(String[] args) {
        Server1 server = new Server1();
        try {
            server.start();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

class ClientHandler implements Runnable {

        private final DatagramSocket clientsocket;

        ClientHandler(DatagramSocket sock) {
            this.clientsocket = sock;
        }

        @Override
        public void run() {
            //receive packet, send msg, get ip, get portnumber ?
        }

    }

}
4

2 に答える 2

1

サーバーが複数のリクエストを同時に処理できるようにしたいですか? これは、ほとんどの Web サーバーの仕組みです。マルチスレッドと同時実行の基本概念を理解する必要があります。

単純なサーバーは、一度に 1 つのことしか処理できません。サーバーが別の処理を行っているときに別のリクエストを受信するとどうなりますか? 何もないので、アプリケーションはあまり効率的ではなく、スケーラブルではありません。

アプリケーションで複数のスレッドをまだ使用したことがなく、並行性についてよく知らない場合は、試してみたり、Oracle Concurrency Lessonを読んだり、オンラインでチュートリアルを見つけたりするのに最適な時期です。

さて、スレッド化のしくみがわかったら (またはわかったら)、関数を可能な限り分解して、どの関数が同時に発生するかを確認してください。私が考えることができるWebサーバーの例はこれです:

  • ポートでリクエストをリッスンする別のスレッド。リクエストを受信したら、「リクエスト プール」に入れ、処理するためにキューに入れます。
  • リクエストを処理する別のスレッド (または複数のスレッド/スレッド プール)

あなたの構造は、同じ Runnable に受信と処理の両方があるように見えます。とにかく、これは単なるアイデアです。アプリケーションにより適したものを確認する必要があります。また、新しい Java バージョンが提供する同時実行ツールを見てください。Java 6 および 7 は、非常に効果的なツールを多数提供しています (ただし、私の意見では、理解して使用するのは非常に困難です)。

幸運を!

于 2013-04-10T16:47:00.223 に答える