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