0

そこで、RMI を使用して Java でクライアント/サーバーのペアを作成しました。ポイントは、クライアントからサーバーにメッセージを送信し、受信したメッセージの数と失ったメッセージの数を出力することです (UDP と比較しているので、RMI で失われると予想される理由を聞かないでください)。

とにかく、コードを書いて、すべてがうまくいくようです。サーバーにバインドしてメッセージを送信すると、サーバーはそれらすべてを受信して​​結果を出力します。

唯一の問題は、クライアントから最後のメッセージを送信した後、RemoteException がスローされ、その理由がわかりません。

私の唯一の推測は、サーバーが最初にシャットダウンしたため、これ以上サーバーに接続できないことを知らせていることです (つまり、iRMIServer 変数が無効になりました)。

面白いことに、クライアントはメッセージの送信後に終了するため、最初にシャットダウンすると思いました。メッセージの受信を確認するためにサーバーからの応答 (ACK) を待つ必要があるため、最初にシャットダウンしない可能性があります。

おそらく、サーバーが応答してすべてが正常であることを知らせるこのオーバーラップ時間中に、サーバーがシャットダウンし、再度接続できなくなります。

クライアント側でメッセージを送信するコードは次のとおりです。

   try { 
         iRMIServer = (RMIServerI) Naming.lookup(urlServer); 

         // Attempt to send messages the specified number of times 
         for(int i = 0; i < numMessages; i++) { 
            MessageInfo msg = new MessageInfo(numMessages,i); 
            iRMIServer.receiveMessage(msg); 
         } 
    } catch (MalformedURLException e) { 
        System.out.println("Errpr: Malformed hostname."); 
    } catch (RemoteException e) { 
        System.out.println("Error: Remote Exception."); 
    } catch (NotBoundException e) { 
        System.out.println("Error: Not Bound Exception."); 
    } 

したがって、送信するメッセージを 1000 選択すると、0 ~ 999 のメッセージが送信されます。

サーバーから結果を出力した後、すぐに System.exit() を呼び出すと、クライアントからの適切な応答を待たずに早期に終了する可能性がありますか?

お役に立てれば大変助かります。さらに情報が必要な場合は、喜んで提供させていただきます。

前もって感謝します。

4

1 に答える 1

0

リモート メソッドの途中でサーバーをシャットダウンすることはできません。サーバーはOKまたは例外ステータス、またはメソッドに戻り値がある場合は戻り値を返す必要があり、クライアントが受信しようとして失敗しているのはそれです。少し後で実行するようにシャットダウンをスケジュールする必要があります。

于 2011-11-17T22:13:10.810 に答える