Java 重用套接字并检测何时需要重新建立

Java 重用套接字并检测何时需要重新建立,java,android,Java,Android,我目前正在为android编写客户端软件,它会反复向服务器发送请求 由于我认为每次发出请求时都要重新连接套接字是一种浪费,因此我尝试开发一种方法,在这种方法中,只要套接字处于活动状态,并且当它处于不活动状态时,就会尝试重新建立联系 这是我当前的解决方案: class Foo { private Socket socket=null; private OutputStream outStream=null; private InputStream inStream=null;

我目前正在为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;
        }


    }


}  
其思想是,所有IOException都将被调用someRequest方法的外部代码捕获,但显然这意味着我的Foo类无法知道套接字需要重新连接

我能想到的唯一解决方案是捕获someRequest中的异常,发出套接字已死亡的信号并重新引发异常,然而,由于我有很多someRequest类型的方法,这似乎不是一个干净的解决方案


谢谢

重新抛出异常是可能的最干净的解决方案,而且非常标准:这意味着您考虑了错误,但无法处理它

小心地抛出您捕获的异常,以免丢失调试信息,这可以通过简单的

catch(IOException ioe) {
  throw ioe;
}
您还可以将此异常包装到您自己的异常类型(FooError或FooException)中,这样,如果您有多个异常原因,调用接口只需要知道一种异常,就可以非常轻松地查明错误原因(如果它使用的是基本处理程序,而不考虑stacktrace)

然后,您可以通过执行thrownFooError.getCause()访问原始异常
ioe
,这样您仍然拥有所需的所有调试信息,并且有一个很好的界面来访问它;所有这些都不会消耗更多的资源

希望有帮助

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