我想检查服务器应用程序是否可用。服务器启动后,我想停止检查,直到服务器更改状态。如何使用我的代码:
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;
}
有没有更好的方法来解决这个问题?
答案 0 :(得分:25)
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)
但这种方法的问题很多:
它只测试某些东西正在侦听连接。如果您的服务位于代理服务器后面......或者由inetd
服务等管理...那么接受的连接并不意味着您的服务实际上正在运行。
这将使您的服务“看到”关闭而不发送请求的连接。因此,您最好对您的服务进行编码,以“优雅地”处理此问题。
重复执行此操作会增加网络和服务器负载。
如果您因为不希望测试“冻结”而设置短暂超时,那么您可能会将其设置得太短并且判断主机在没有时会停机。
< / LI>服务器启动后,我想停止检查,直到服务器更改状态
这几乎是不可能的。原因是如果不进行检查,您将无法判断服务器是否已“更改状态”。或者至少,如果没有实现精心设置的状态通知服务,您将无法执行此操作,其中服务器调用客户端以告知它正在更改状态。 (如果“更改状态”包括“死亡”或“丢失网络连接”,那么您将无法使 通知可靠...如果有的话。)
答案 1 :(得分:4)
首先检查服务器是否正在运行,服务器是否接受连接。
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;
}
答案 2 :(得分:3)
public static boolean hostAvailabilityCheck() {
try (Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)) {
return true;
} catch (IOException ex) {
/* ignore */
}
return false;
}
工作,但问题是,当你通过WI-FI打开手机时,它会突然停止&&#34;没有动作。为了思考... =)
下一个代码将通过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;
}