gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:54:22 25 4
gpt4 key购买 nike

我目前正在为 android 编写客户端软件,它将重复向服务器发送请求。

因为我认为每次发出请求时都重新连接套接字是一种浪费,所以我尝试开发一种方法,其中只要套接字处于 Activity 状态,就使用它,当它死掉时,将尝试重新连接- 建立联系。

这是我当前的解决方案:

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),这样如果你有多种异常原因,调用接口(interface)只需要知道一种异常并可以查明原因很容易出错(如果它使用基本处理程序而不考虑堆栈跟踪)。

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

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

希望有帮助。

关于java - 重用套接字并检测何时需要重新建立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5376497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com