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,如何使用java检查服务?我找到了,但它只用于检查主机名 我的问题是如何检查端口x上的服务是否正在运行,例如:myhostname:8080或myhostname:8099,我可能正在这些端口上运行服务n或p,但如果我手动执行,它将通过web可见,我如何在java中实现相同的效果?您可以使用套接字来执行此操作 new Socket("localhost", 8080).getInputStream() 用try-catch块围绕它,你就有了一个解决方案。这个片段发送一个ping,你无法通过操纵

如何使用java检查服务?我找到了,但它只用于检查主机名


我的问题是如何检查端口x上的服务是否正在运行,例如:
myhostname:8080
myhostname:8099
,我可能正在这些端口上运行服务n或p,但如果我手动执行,它将通过web可见,我如何在java中实现相同的效果?

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

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

用try-catch块围绕它,你就有了一个解决方案。

这个片段发送一个ping,你无法通过操纵来实现你想要的。只要抓住任何例外

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

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

只需尝试连接到套接字即可

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

如果未引发异常,则主机正在该端口上接受连接。如果不是,您通常会得到一个。

因为您的服务是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();
}

只要尝试使用该服务并在出现异常时进行处理即可。在使用任何资源之前,通常没有必要对其进行可用性测试。如果在测试时可用,而在使用时不可用,该怎么办?

socket变量应该在try块之外,以便在finally块中关闭。@h3xStream我身上没有java编译器可供测试,但您确定这是必要的吗?如果socket构造函数引发异常,您无法关闭它,所以只需
新建套接字(主机、端口).close()try
块中的code>就可以了。@Greg你比我先做了,不过有一个麻烦是
close()
会抛出一个
IOException
,所以如果你想区分打开套接字时的失败和关闭套接字时的失败,在try中使用
close
可能会使事情复杂化。不管怎样,这里不需要使用
finally
。@Greg,@Laurence谢谢,我已经做了更改。