我目前正在编写用于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;
}
}
}
这个想法是所有的ioxceptions都会被调用someRequest方法的外部代码捕获,但显然这意味着我的Foo类无法知道socket需要重新连接!
我能想到的唯一解决方案是捕获someRequest中的异常,表示套接字已死并重新抛出异常,但是由于我有一些someRequest类型的方法,这似乎不是一个干净的解决方案。 / p>
感谢。
答案 0 :(得分:1)
重新抛出异常是最干净的解决方案,而且非常标准:它意味着您考虑到错误但无法处理。
小心准确地抛出你捕获的异常,这样你就不会丢失调试信息,这可以用一个简单的
来完成catch(IOException ioe) {
throw ioe;
}
你可以做的是将这个异常包装到你自己的异常中(FooError或FooException),这样如果你有几个异常原因,调用接口只需要知道一种异常并且可以找出原因错误很容易(如果它使用基本处理程序而不考虑堆栈跟踪)。
catch(IOException ioe) {
throw new FooError(ioe);
}
然后您可以通过ioe
访问原始异常thrownFooError.getCause()
,这样您仍然可以获得所需的所有调试信息并拥有一个很好的界面来访问它;所有这一切都没有消耗更多的资源。
希望它有所帮助。