2011-03-21 22 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