2011-01-10 80 views
2

如何使用java检查服务?我发现this article,但它仅用于检查主机名。从java检查服务可用性

我的问题是我如何检查端口x的运行服务,例如:myhostname:8080myhostname:8099,我可能会在这些端口上运行服务n或p,但如果我手动执行它可以通过网络看到,怎么可以我在java中实现相同的效果?

回答

5

该代码段发送一个ping,您无法操作它来实现所需。只需open a socket并捕捉任何例外。

bool success = true; 
try { 
    (new Socket(host, port)).close(); 
} catch (UnknownHostException e) { 
    // unknown host 
    success = false; 
} catch (IOException e) { 
    // io exception, service probably not running 
    success = false; 
} 

如果需要检测哪个服务正在运行,那么你需要阅读发送的第一个字节,并将它们与你所知道的每一个服务应该送。这可能需要几次来回传递。

+0

套接字变量应该在try块之外,以便在finally块中关闭。 – h3xStream 2011-01-10 23:45:34

0

您可以使用套接字来执行此操作。

new Socket("localhost", 8080).getInputStream() 

用try catch块环绕,你有一个解决方案。

+0

再加上close()。 – EJP 2011-01-10 23:27:28

2

只是试图连接到插座。

InetAddress addr = InetAddress.getByName("myhostname"); 
Socket socket = new Socket(addr, 8099); 

如果没有抛出异常,则主机正在接受该端口上的连接。如果不是,你通常会得到一个ConnectException

3

由于您的服务是Web,您可能需要添加验证的响应代码。

boolean available = false; 
HttpURLConnection conn = null; 
try { 
    conn = (HttpURLConnection) new URL("http://yourdomain/").openConnection(); 
    conn.connect(); 

    if(conn.getResponseCode() == 200) 
     available = true; 
} 
catch(IOException e) { 
} 
finally { 
    if(conn != null) 
     conn.disconnect(); 
} 
1

只是试图使用服务并处理异常。在使用它之前,测试任何资源的可用性通常没有意义。如果它在测试时可用,而不是在使用时会怎样?