在轮询中从线程连接到远程端口(Server)

时间:2014-01-24 18:00:47

标签: java sockets exception-handling thread-safety serversocket

我想从线程连接到远程服务器并继续发送字符串。如果连接被拒绝,则线程应该继续轮询端口,直到服务器再次启动。如何处理此异常并使我的线程崩溃?服务器可能不会很长时间,但线程应该无限期运行。

public void SendMessage(String message){
    try {
        socket = new Socket(actuatorAddress, destPort.get());
        outToServer = socket.getOutputStream();
        out = new DataOutputStream(outToServer);
        out.flush();
        out.write(message.getBytes());
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

我改变了部分代码,如下所示。第一次调用Connect函数,然后通过线程调用Send Message函数。添加到重新连接的延迟有助于减少因连接到非现有服务器而重复出现的时间延迟。仍然认为可能有更好的解决方案来解决基本问题。

public boolean ConnectToActuator() {
    try {
        if(actuatorAddress.isReachable(2000)){
            socket = new Socket();
            socket.setPerformancePreferences(1, 2, 0);
            socket.setTcpNoDelay(false);
            socket.setSendBufferSize(32);
            socket.connect(new InetSocketAddress(actuatorAddress, destPort.get()));
            outToServer = socket.getOutputStream();
            out = new DataOutputStream(outToServer);
            connected = true;
            disconnectedTimeout = 0;
        }
    }catch (ConnectException e) {
        // TODO Auto-generated catch block
        System.out.println(e.getMessage());
    }catch (IOException ex) {
        connected = false;
        System.out.println(ex.getMessage());
    }
    return connected;
}

public boolean SendToActuator(String message) {
    if(connected == false){ //socket.isOutputShutdown()
        disconnectedTimeout++;
        if(disconnectedTimeout>20){
            disconnectedTimeout = 0;
            ConnectToActuator();
        } else {
            return connected;
        }
    }
    try {
        out.flush();
        out.writeBytes(message);
        disconnectedTimeout = 0;
        connected = true;
    } catch (UnknownHostException uhe) {
        connected = false;
        System.out.println(uhe.getMessage());
    } catch (IOException ioe) {
        connected = false;
        System.out.println(ioe.getMessage());
    }
    return connected;
}

3 个答案:

答案 0 :(得分:1)

鉴于评论中存在以下限制:

  • 尝试将邮件发送到10台服务器之一。
  • 如果没有任何服务器可用于接收消息,请丢弃该消息。

你真正想做的是:

  1. 遍历服务器地址列表
  2. 尝试向每个人发送消息
  3. 如果成功
  4. ,立即突破循环
  5. 在连接失败时捕获任何错误并尝试下一个服务器
  6. 这是一个将贯穿该场景的示例类。

    import java.io.DataOutputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class MessageSender {
      private static final Integer destPort = 1234;
    
      private static final String[] serverAddresses = {
        "address1",
        "address2",
        "address3" // Etc....
      };
    
      public Boolean SendMessage(String message) {
        Boolean messageSentSuccessfully = false;
        for (String addy : serverAddresses) {
          messageSentSuccessfully = SendMessageToServer(addy, message);
          if (messageSentSuccessfully) {
            break;
          }
        }
        return messageSentSuccessfully;
      }
    
      private Boolean SendMessageToServer(String serverAddress, String message) {
        Boolean messageSent = false;
        try {
          Socket dataSocket = new Socket(serverAddress, destPort);
          OutputStream outToServer = dataSocket.getOutputStream();
          DataOutputStream out = new DataOutputStream(outToServer);
          out.write(message.getBytes());
          out.flush();
          messageSent = true;
        } catch (Exception e) {
          System.out.println(e);
        }
        return messageSent;
      }
    }
    

    希望有所帮助。

答案 1 :(得分:0)

伪:

while(true){
  if(connect()) DoClientConnectedStuff();
  sleep(reconnectTimeout);
};

答案 2 :(得分:-1)

请尝试以下更改。如果您的连接拒绝,它将等待2秒(2000毫秒),然后再次尝试连接服务器。如果连接成功,它将采用输出流,在while循环中写入数据并刷新数据。

public void createSocketConnection() throws IOException
{     
    socket = new Socket(actuatorAddress, destPort.get());
    if(socket!=null)
        {
          outToServer = socket.getOutputStream();
          out = new DataOutputStream(outToServer);
        }

}

public void SendMessage(String message){
    boolean isRunning=false;
    try 
    {
        createSocketConnection();
        isRunning=true;
        while(isRunning)
        {
          out.write(message.getBytes());
          out.flush();
       }
    } catch (java.net.ConnectException conExcp) {
        System.out.println(ex.getMessage());
        try{
          Thread.sleep(2000);
        }catch(Exception ee){}
    } 
    catch (IOException ex) {
        System.out.println(ex.getMessage());

    } 
}