使用socket是检查服务器的好方法吗? 像这样
public boolean hostAvailabilityCheck(String serverAddress, Integer serverPort) {
try {
Socket s= new Socket(serverAddress, serverPort);
s.close();
} catch (IOException exception) {
return false;
}
return true;
}
或者这是更好的
public boolean isServerAvailable(String serverAddress, Integer serverPort) {
boolean isAlive = true;
try {
URL url = new URL("http:/" + serverAddress + serverPort);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.connect();
httpURLConnection.disconnect();
} catch (Exception e) {
isAlive = false;
}
return isAlive;
}
我试图查看solr服务器是否可以推送数据我不确定哪个好!我希望 org.apache.solr.client.solrj.response SolrPingResponse类也做同样的事情。感谢
答案 0 :(得分:0)
只有当您知道目标主机上正在运行的端口的特定服务时,才能打开套接字。
您还可以使用InetAddress.isReachable()
尝试多种方法来测试InetAddress指定的主机是否可访问。当然这种方法也不是100%保证,因为它不了解自定义配置的服务,但它是一个很好的起点。
答案 1 :(得分:0)
接受套接字连接并不一定表示服务器可以在那时处理请求。发送http请求是检查服务器可用性的更好方法。这是负载平衡器最广泛使用的,用于检查处理请求的服务器可用性。除了建立http连接之外,您还需要发送虚拟请求&确认HTTP为其发送成功状态代码。
答案 2 :(得分:0)
考虑到new Socket(String, int)
的定义,这可以在任意端口上建立服务器存在(例如,您可以允许来自端口22,ssh的套接字)。这只是你尝试的所有端口的问题。
第二个代码做的事情非常不同!它不是仅测试给定的URL是否连接到服务器,而是询问给定的URL是否连接到 HTTP服务器!如果URL没有HTTP服务器支持,则连接失败...
...它无法获得HttpURLConnection
,因为没有HTTP服务器来创建HTTP连接 - 不是因为服务器(在此地址)无法接受来自其他端口的信息。
答案 3 :(得分:0)
ping()
的{{1}}方法不只是连接到套接字,它还向SolrJ
发出HTTP GET请求,以查看容器和Solr应用程序是否响应。这允许SolrJ测试Solr实例实际上是在回答查询,而不仅仅是容器仍在接受套接字连接。
这种区别对您来说是否重要是您必须自己决定的,尽管我建议在测试中包含SolrJ并使用/admin/ping
方法自行检查连接性。
在第三方应用程序监控解决方案中,您将使监控应用程序向ping
发出HTTP GET请求以获得最佳结果。