2011-03-21 18 views
0

我目前正在編寫用於android的客戶端軟件,它將重複發送請求到服務器。重新使用套接字並檢測它何時需要重新建立

因爲我認爲每次發出請求時都會重新連接套接字是件很浪費的事情我試着開發一種方法,只要套接字處於活動狀態並且當它死了,就會嘗試一次重新建立聯繫。

這是我目前的解決方案:

class Foo 
{ 
    private Socket socket=null; 
    private OutputStream outStream=null; 
    private InputStream inStream=null; 




    public void someRequest() throws UnknownHostException, IOException 
    { 
     setupConnection(); 

     // Do stuff with outStream and inStream here 


    } 

    private void setupConnection() throws UnknownHostException, IOException 
    { 

     try 
     { 
      if(socket!=null && socket.isConnected() && !socket.isClosed()) return; 


      if(outStream!=null) outStream.close(); 
      if(inStream!=null) inStream.close(); 

      socket = new Socket(SERVER_NAME,SERVER_PORT); 
      outStream = socket.getOutputStream(); 
      inStream = socket.getInputStream(); 
     } 
     catch(IOException e) 
     { 
      socket = null; 
      throw e; 
     } 


    } 


} 

的想法是,所有的IOExceptions將由外部代碼調用someRequest方法抓住了,但是顯然這意味着,有沒有辦法讓我的Foo類知道該套接字需要重新連接!

我能想出的唯一解決方案是捕獲someRequest中的異常,表示套接字已死並重新拋出異常,但是由於我加載了一些SomeRequest類型的方法,這看起來不是一個乾淨的解決方案。

謝謝。

回答

1

重新發現異常是最簡潔的解決方案,它非常標準:它意味着您考慮了錯誤但無法處理它。

小心扔正是你擦肩而過,所以你不要鬆調試信息外,這可以用一個簡單的

catch(IOException ioe) { 
    throw ioe; 
} 

做你能做什麼也換這個異常到你自己的一種異常(FooError或FooException),這種方式如果你有幾個異常原因,調用接口只需要知道一種異常,並且可以很容易地查明錯誤的原因(如果它使用的是基本處理程序而沒有接受記錄堆棧跟蹤)。

catch(IOException ioe) { 
    throw new FooError(ioe); 
} 

然後,您可以通過執行thrownFooError.getCause()這樣你仍然有你需要的所有調試信息,並有一個漂亮的界面來訪問它訪問原始異常ioe;所有這些都沒有消耗更多的資源。

希望它有幫助。

+0

我結束了這個解決方案,所以非常感謝你! – monoceres 2011-03-23 16:00:30