3

sppを介してサーバークライアント接続を実装しようとしています。

サーバーを初期化した後、最初にクライアントをリッスンし、次にクライアントからデータを受信するスレッドを開始します。それはそのように見えます:

public final void run() {
    while (alive) {
        try {
            /*
             * Await client connection
             */
            System.out.println("Awaiting client connection...");
            client = server.acceptAndOpen();

            /*
             * Start receiving data
             */
            int read;
            byte[] buffer = new byte[128];
            DataInputStream receive = client.openDataInputStream();
            try {
                while ((read = receive.read(buffer)) > 0) {
                    System.out.println("[Recieved]: "
                            + new String(buffer, 0, read));

                    if (!alive) {
                        return;
                    }
                }
            } finally {
                System.out.println("Closing connection...");
                receive.close();
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

メッセージを受信できるので問題なく動作しています。私を悩ませているのは、デバイスが範囲外になったときにスレッドが最終的にどのように死ぬのかということです。

まず、receive.read(buffer)スレッドがデータを受信するまで待機するように、ブロックを呼び出します。デバイスが範囲外になった場合、その間に中断されたかどうかを確認するために先に進むことはありません。

次に、接続が閉じられることはありません。つまり、サーバーが範囲内に戻ると、サーバーはデバイスを受け入れません。

4

1 に答える 1

3

リモートデバイスが範囲外になると、リンク監視タイムアウトの期限が切れた後、ローカルスタックは接続を閉じる必要があります。JSR-82の実装に応じて、receive.read(buffer)-1を返すか、。をスローしIOExceptionます。これをシミュレートするには、リモートデバイスの電源を切るか、範囲外に移動します。

于 2011-01-02T08:45:46.050 に答える