2012-03-29 87 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(); 
     } 
    } 

現在,客戶基本上只是一個數字的向服務器發送一個請求方法和返回響應。我希望能夠從服務器接收更新。 我會很感激任何關於閱讀的建議,可以幫助我找到解決方案。 有沒有我可以看到的模式?

謝謝你,veLr。

回答

1

I want to be able to receive updates from the server

我認爲你有兩個選擇這樣做。

  • 選項1是讓您的客戶端輪詢服務器以獲取更新。我不會推薦這個,因爲這最終會增加你的服務器負載。在嘗試擴展系統時,您很可能會遇到性能問題。

  • 選項2是在您的客戶端上創建一個小型服務器。所以基本上,只要有更新,服務器就會連接到客戶端並向其發送更新。我會推薦這個程序,因爲它只允許你在需要時在你的服務器和客戶端之間建立連接。與以前的方法相反,問題是您需要跟蹤客戶端的端口和IP。您可以實施一個HashTable,將客戶端ID作爲密鑰及其連接屬性作爲其密鑰。一旦你有更新,你將在HashTable中查找客戶端,獲取連接信息,連接併發送信息。

然後,客戶端的服務器將獲取數據並在收到更新後執行您希望客戶端執行的任何操作。

+1

選項3是客戶端連接到服務器,但等待服務器通過連接發送更新。這樣可以避免輪詢,還可以避免服務器啓動連接回客戶端,這在涉及防火牆時往往會導致問題。 (加上它很奇怪。) – Wyzard 2012-03-29 08:42:30

+0

@Wyzard:如果我正確理解你,你希望客戶端在服務器上打開一個端口並保持打開狀態而不做任何事情? – npinti 2012-03-29 08:45:00

+0

打開*連接*,但是。 (「打開端口」意味着要麼監聽傳入的連接,要麼配置防火牆以允許通過連接。)客戶端啓動連接,因爲它知道服務器的地址,服務器不需要知道所有客戶端的連接,地址。但是一旦連接,服務器就知道什麼時候需要發送更新,而客戶端不知道。所以服務器啓動更新。 – Wyzard 2012-03-29 08:51:18