3

DatagramSocket クラスと DatagramPacket クラスを使用してサーバー プログラムを作成しようとしていますが、現在のコードでは醜い while ループを使用しているため、サーバーの実行中にプログラムがフリーズしますが、サーバーは問題なく正常に実行されます。とにかくコードは以下です。とにかく、while ループ以外のものを使用したり、while ループがプログラム内の他のコードの実行を妨げないようにすることはできますか?

protected void run() {
    try {
        socket = new DatagramSocket(port);
        socket.setBroadcast(true);
    } catch (Exception e) {
        e.printStackTrace();
        stopServer(); //stop the server
        return; 
    }
    while(isRunning()){ //hate this loop
        try {
            byte[] buf = new byte[256];
            DatagramPacket packet = new DatagramPacket(buf, 256);
            socket.receive(packet);
            DatagramPacket serverPacket;
            byte[] serverBuf;
            byte hb = 0;
            byte lb = packet.getData()[0];
            int e = ((int)hb<<8)|((int)lb&0xFF); //translate byte to int
            switch(e) {
                case 2:
                    //do something
                    break;
                case 5:
                   //do something
                   break;
                case 7:
                    //do something
                    break;
                default:
                    //default stuff
                    break;
            }
        } catch (Exception e) {
            System.out.println("Fatal Server Error:");
            e.printStackTrace(); 
            stopServer(); //stop the server
            return; //stop the method
        }
    }
}
4

3 に答える 3

8

これを新しいスレッドに入れる必要があります。パケットを受信するプロセスには同期IOが含まれるため、実行中のスレッドを常にブロックします。

明確にするために、プログラムの残りの部分を待機させるのは、whileループ自体ではありません。これはsocket.receive()呼び出しです。

于 2012-07-15T13:17:11.137 に答える
4

論理的には、サーバーが複数のリクエストを「処理」することを意図しているため、ループを取り除くことができるとは思えません。すべてのリクエストは、サーバー ループから 1 回の反復で処理されます。

現在、サーバーはリクエストの受信のみを考慮し、それらをスレッドプールにディスパッチして処理するのが通例です。

そのため、サーバー スレッドが特定のリクエストの処理について心配する必要はありません。基本的に、サーバーがリクエストの処理でビジー状態の場合、その間にポートに到着する他のリクエストに対応できないためです。

推奨事項は、パケットを受信し、受信したデータをすぐに別のスレッドに渡して処理することです。

これは明らかに、問題のループの除去を意味するものではありません。これは、前述したように、クライアントからの要求を 1 つだけ処理するつもりでない限り不可能です (かなりありそうもないシナリオです)。これにより、リクエストを個別に処理できることが保証され、その処理によってサーバー ポートに到着する他のリクエストへの対応が遅れることはありません。

于 2012-07-15T13:24:44.447 に答える
0

フローとネットワーク通信を管理するには、 Apache Minaを使用することをお勧めします。

これは特にこのために設計されており、Reactor設計パターンの実装を提供します。これは、アプリケーションにとってより良い設計選択となる可能性があります。

于 2012-07-15T13:33:09.757 に答える