Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java代码检查服务器是否联机_Java_Sockets - Fatal编程技术网

从Java代码检查服务器是否联机

从Java代码检查服务器是否联机,java,sockets,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; publi

我想检查服务器应用程序是否可用。服务器启动后,我想停止检查,直到服务器状态发生变化。如何使用我的代码执行此操作:

 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;   
    } 

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

首先检查服务器是否正在运行,服务器是否接受连接

   public static boolean hostAvailabilityCheck()
{ 
    s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT);
    boolean available = true; 
    try {               
        if (s.isConnected())
        { s.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;   
} 

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

除了简化异常处理之外,这还消除了讨厌的
Socket
泄漏。(如果您关心执行此检查所需的时间,请在尝试连接之前设置连接超时:请参阅)

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

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

  • 这将导致您的服务“看到”在不发送请求的情况下关闭的连接。因此,您最好为您的服务编写代码,以“优雅地”处理此问题

  • 重复这样做会增加网络和服务器负载

  • 如果因为不希望测试“冻结”而设置了较短的超时,则可能会将其设置得太短,并在主机未关闭时判断主机已关闭


服务器启动后,我想停止检查,直到服务器状态发生变化


这几乎是不可能的。原因是,如果不进行检查,您将无法判断服务器是否已“更改状态”。或者至少,如果不实现一个复杂的状态通知服务,服务器将调用客户端告知其正在更改状态,那么您将无法做到这一点。(如果“更改状态”包括“死亡”或“网络连接丢失”,那么您将无法使该通知可靠…如果是的话。)

我在ServerUtil中使用了此方法

    public static boolean isOnline() {
    boolean b = true;
    try{
        InetSocketAddress sa = new InetSocketAddress("SERVER_IP_ADDRESS", PORT);
        Socket ss = new Socket();
        ss.connect(sa, 1);
        ss.close();
    }catch(Exception e) {
        b = false;
    }
    return b;
}
工作正常,但问题是当你通过WI-FI打开手机时,会出现“尖叫停止”而没有任何动作。思想…=)

下一个代码将通过WI-FI工作。。。如果您增加连接时间-

public static boolean isOnline() {
    boolean b = true;
    try{
        InetSocketAddress sa = new InetSocketAddress("SERVER_IP_ADDRESS", PORT);
        Socket ss = new Socket();
        ss.connect(sa, 1);            --> change from 1 to 500 (for example)
        ss.close();
    }catch(Exception e) {
        b = false;
    }
    return b;
}

静态字段
connected
似乎非常无用,因为您永远不会更改它。这将检查主机/端口对是否可用,但不会检查任何功能。。。这可能是因为背后的服务软件是fubar,HTTP总是返回500,例如,这可以帮助您的URL(URL到应用程序)可以是服务器地址+TCP服务器端口也可以看到这一点您正在检查什么,物理服务器的可用性,或在其上运行的应用程序,与Tomcat一样,所有三个
catch
块上的代码都是相同的;可以将其合并为一个(在本例中可能应该是这样)。最好假设服务器不可用(
boolean available=false
),然后仅当您能够访问它时才将其设置为true。这样,如果出现异常或故障,我们就不会继续基于现在不正确的布尔值进行连接。@Aarondigula我不确定他是否在使用J7。您应该使用线程来检查连接。由于这是tcp,您应该使用线程发送连接请求并经常获得响应。在您刚刚连接后测试
s.isConnected()
行完全没有意义。如果没有连接,构造函数就会抛出异常。
public static boolean hostAvailabilityCheck() { 
    try (Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)) {
        return true;
    } catch (IOException ex) {
        /* ignore */
    }
    return false;
}
public static boolean isOnline() {
    boolean b = true;
    try{
        InetSocketAddress sa = new InetSocketAddress("SERVER_IP_ADDRESS", PORT);
        Socket ss = new Socket();
        ss.connect(sa, 1);            --> change from 1 to 500 (for example)
        ss.close();
    }catch(Exception e) {
        b = false;
    }
    return b;
}