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