java - 从 Java 代码检查服务器是否在线

标签 java sockets

我想检查服务器应用程序是否可用。服务器启动后,我想停止检查,直到服务器更改状态。如何用我的代码做到这一点:

 private static final String SERVER_ADDRESS = "192.144.10.10";
    private static final int TCP_SERVER_PORT = 8890;
    private static boolean connected = false;
    static Socket s;

    public static void main(String[] args) {

    Timer timer = new Timer();
    timer.schedule(task, 01, 5001); }  

static TimerTask task = new TimerTask() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (connected == false)
            {
            System.out.println(hostAvailabilityCheck());
            }
        }
    };

    public static boolean hostAvailabilityCheck()
    { 

        boolean available = true; 
        try {               
            if (connected == false)
            { (s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)).close();    
            }               
            } 
        catch (UnknownHostException e) 
            { // unknown host 
            available = false;
            s = null;
            } 
        catch (IOException e) { // io exception, service probably not running 
            available = false;
            s = null;
            } 
        catch (NullPointerException e) {
            available = false;
            s=null;
        }


        return available;   
    } 

有没有更好的办法解决这个问题?

最佳答案

check 方法可以重写如下(Java 7 及更高版本):

public static boolean hostAvailabilityCheck() { 
    try (Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)) {
        return true;
    } catch (IOException ex) {
        /* ignore */
    }
    return false;
}

除了简化异常处理之外,这还消除了令人讨厌的 Socket 泄漏。 (如果您担心执行此检查所花费的时间,请在尝试连接之前设置连接超时:请参阅 Setting a timeout for socket operations)

但是这种方法的问题是多方面的:

  • 它只测试 something 正在监听连接。如果您的服务位于代理之后……或者由类似 inetd 服务的东西管理……那么接受的连接并不意味着您的服务实际上正在工作。

  • 这将导致您的服务“看到”在未发送请求的情况下关闭的连接。所以你最好编写你的服务来“优雅地”处理这个问题。

  • 重复执行此操作会增加网络和服务器负载。

  • 如果您因为不想让测试“卡住”而设置了一个较短的超时时间,那么您就有可能将其设置得太短,并在没有时判断主机已关闭。


After server is started I want to stop checking until the server changes status

这几乎是不可能的。原因是您将无法在不检查的情况下判断服务器是否“更改了状态”。或者至少,如果不实现详细的状态通知服务,服务器调用客户端告诉它正在更改状态,您将无法做到这一点。 (如果“更改状态”包括“死亡”或“丢失网络连接”,那么您将无法使 通知可靠......如果有的话。)

关于java - 从 Java 代码检查服务器是否在线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17147352/

相关文章:

c++ - c tcp套接字非阻塞接收超时

python - 关闭 Tornado 中的所有(保持事件)套接字连接?

java - .NET与Java子串操作性能对比

node.js - 强制 process.exit() 与手动关闭所有打开的资源/套接字

java - 如何选择 jquery 无序下拉列表 selenium webdriver

java - 实现范围索引,以便在时间复杂度方面非常有效地计算包含集

windows - 使用临时端口的 Boost::asio UDP 广播

c++ - Golang 从 TCP 端口读取常量数据

java - 在带有对象的 arrayList 中查找字符串时出现问题

java - 从 java/groovy 中的文本文件读取导入