2012-03-29 13 views
0

私は現在Javaでクライアント/サーバアプリケーションを開発していますが、クライアントの設計方法については心配していません。Javaクライアントを設計する

現在、私は複数の接続を受け入れることができるサーバーを持っており、すべての接続にはループを持ち、コマンドをリッスンして応答します。サーバーは次のようになります。

try{ 

     mIn = new DataInputStream(mSocket.getInputStream()); 
     mOut = new DataOutputStream(mSocket.getOutputStream()); 

     while(true){ 

      byte tPackType = mIn.readByte(); 

      switch(tPackType){ 

       case PackType.LOGIN: 
        login(); 
        break; 
       case PackType.REGISTER: 
        register(); 
        break; 
       default: 

      } 

     } 

    }catch (IOException e){ 
     mLog.logp(Level.WARNING, this.getClass().getName(), "run()", "IOException in run()", e); 
    }finally{ 
     try{ 
      mOut.close(); 
      mIn.close(); 
      mSocket.close(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 

ここで、クライアントは基本的にサーバーに要求を送信する多数のメソッドであり、応答を返します。私はサーバーから更新を受け取ることができるようにしたい。 私は解決策を見つけるのを助けることができる読書に関する提案を感謝します。 見ることができるパターンはありますか?

ありがとうございました。

答えて

1

I want to be able to receive updates from the server

私はあなたがこれを行うには、2つの選択肢を持っていることと思います。

  • オプション1は、クライアントに更新をポーリングすることです。私はこれが最終的にあなたのサーバーへの負荷を増加させるので、これをお勧めしません。システムの規模を拡大しようとすると、パフォーマンスの問題が発生する可能性が高くなります。

  • オプション2は、クライアントに小さなサーバーを作成することです。つまり基本的には、更新があるたびに、サーバーはクライアントに接続して更新を送信します。必要なときにのみサーバーとクライアント間の接続を確立できるので、この手順をお勧めします。問題は、以前の方法とは対照的に、クライアントのポートとIPを追跡する必要があることです。クライアントIDをキーとして、その接続プロパティをキーとしてHashTableを実装できます。アップデートが完了すると、HashTableでクライアントを検索し、接続情報を取得し、接続して情報を送信します。

クライアント側のサーバーは、データを取得して、更新が受信されるとクライアントが行う処理を行います。

+1

オプション3は、クライアントがサーバーに接続してからサーバーが接続を介して更新を送信するまで待機することです。これにより、ポーリングは回避されますが、サーバーがクライアントへの接続を開始することも回避され、ファイアウォールが関与しているときに問題を引き起こす傾向があります。 (プラス奇妙です。) – Wyzard

+0

@Wyzard:あなたを正しく理解していれば、クライアントはサーバー上のポートを開き、何もせずに開いたままにしますか? – npinti

+0

*接続*を開きますが、はい。 (「ポートを開く」とは、着信接続をリッスンするか、接続を許可するようにファイアウォールを構成することを意味します)。クライアントはサーバーのアドレスを知っており、サーバーがクライアントのアドレスをすべて知っている必要がないため、アドレス。しかし、いったん接続されると、サーバーは更新がいつ送信される必要があるかを知り、クライアントはそれを知らない。したがって、サーバーは更新を開始します。 – Wyzard

関連する問題