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