gpt4 book ai didi

java - 使用 Java 中的套接字自动重新连接到服务器

转载 作者:可可西里 更新时间:2023-11-01 02:41:04 25 4
gpt4 key购买 nike

我的应用程序中有一个组件通过 TCP 监听服务器(因此它只接收数据,从不使用输出流)。可能断开连接的唯一原因是技术问题。从逻辑的角度来看,连接应该永远保持打开状态。

我知道,如果我想立即检测到连接故障,我必须实现某种 ping/pong 策略。但就我而言,没有必要立即检测到断开的连接,只要它完全被检测到即可(比方说几分钟或几小时后)。

我的问题:

  1. 如果我不使用某种 pingpong/alive-check 策略并且连接断开,我会在一段时间后在我的应用程序逻辑中得到一个 IOException 吗(如果需要几个小时也没关系)或者是否有可能根本没有检测到断开的连接?
  2. 下面的代码是否符合我的要求?这有点难看(许多 try-catch/while(true) 甚至 sleep ,但我想知道是否可以在一定时间后识别超时连接(例如,由于阻塞 BufferedReader.readLine 方法中的 IOException ).
  3. 除了上面的问题,我还有什么可以做得更好的?

    public class Receiver implements Runnable {

    private Socket socket;
    private final String host;
    private final int port;
    private final int connectionRetryAfter = 10* 1000;

    public Receiver(String host, int port) { // assignments... }

    @Override
    public void run() {
    tryCreateSocket();
    listenToServer();
    }

    private void listenToServer() {
    String receivedLine;
    BufferedReader buf;
    while(true) {
    try {
    buf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    while ((receivedLine = buf.readLine()) != null) {
    // do something with 'inputLine'
    }
    } catch (IOException e) {
    // logging
    } finally {
    closeSocket();
    }
    // At this point, either an exception occured or the stream equals null (which means it's closed?)
    tryCreateSocket();
    }
    }

    private void tryCreateSocket() {
    try {
    socket = new Socket(host, port);
    } catch (IOException e) {
    // logging
    try {
    Thread.sleep(connectionRetryAfter);
    } catch(InterruptedException ex) {
    // logging
    Thread.currentThread().interrupt();
    }
    // retry
    tryCreateSocket();
    }
    }

    private void closeSocket() {
    if (socket != null) {
    try {
    socket.close();
    } catch (IOException e) {
    // logging
    }
    }
    }

最佳答案

如果连接/重新连接尝试失败,

listenToServer() 肯定会抛出 IOException。考虑服务器关闭时的情况。你真的想永远在这个方法中循环吗?

关于java - 使用 Java 中的套接字自动重新连接到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067551/

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