如何检查服务器是否在线?

如何检查服务器是否在线?

问题描述:

我正在做某种客户端 - 服务器连接。客户端可以连接到多个服务器,因此需要知道该服务器是否在线。我不想先输入所有的登录信息,而是希望JLabel能够显示服务器是否在线。我如何检查这一点,而不与服务器建立真正的连接?如何检查服务器是否在线?

+0

什么样的客户端 - 服务器连接?它是否可以代理(如HTTP)? – 2013-05-12 18:39:19

+0

我不太了解网络,但它是使用套接字的连接。 – Creator13 2013-05-12 18:53:56

+1

然后,没有冒犯,但你正确完成这项工作的几率是相当低的。 – 2013-05-12 19:08:40

,最好的办法是让服务器真正的连接,并要求它,如果它是在线,使用尽可能接近实际使用的方法服务器。其他方法创建独立的失败模式和不同的方法,必须单独维护,一个可能会失败,另一个可能会失败。

想想像代理和防火墙的东西。为什么要让自己和每个需要使用系统的人都感到困难?除非你没有告诉我们有什么不寻常的事情,否则没有必要创建一个完全不同的访问方法来测试可用性。

+0

由于客户端使用服务器端语句'ServerSocket.accept()'的服务器,并且它在连接上创建了一个新的线程,所以我不希望发生这种情况,只是为了测试连接。 一般来说,因为这是从Minecraft Bukkit服务器运行的,所以我想可能有客户端连接。 – Creator13 2013-05-12 18:58:34

+0

然后当服务器不在线时(例如,如果进程没有运行),并且被告知多次不在线时(例如,如果在代理服务器或防火墙后面),服务器会多次联机阻止ICMP回声)。 – 2013-05-12 19:09:27

我不知道是否可以使用java ping服务器。但是您可以尝试在您的Main的构造函数中ping服务器的ip,并且如果它返回回显,请使标签更改其值。

使用InetAddress.isReachable

注意,这将检查服务器是否可达,不是是否与特定URL /服务。为此,你最好做一个测试请求。

尝试这样的事情来ping它:

InetAddress address = InetAddress.getByName("address"); 

    if (address.isReachable(3000)) 
     label.setName("online") 
+3

这是一个危险的建议。首先,你不知道他的客户机 - 服务器协议是否可以被委托。如果是这样,客户端在代理服务器后面将会失败。如果服务器位于不传递ping命令的防火墙之后(或者服务器本身不回复它),它也会失败。 – 2013-05-12 18:39:51

+0

这也是一个不正确的建议。如果主机启动并且服务关闭,它将返回误报。 – EJP 2013-05-13 01:53:41

只需连接。

发现任何资源是否可用的最佳方法是尝试使用它。这适用于网络连接,文件,任何你喜欢的。编写其他内容如isReachable(),exists(),isWritable()等的辅助测试时,最好重复使用该资源时系统将要执行的操作,最坏的情况下执行不同的操作,以产生不同的结果。

在任何一种情况下,您都会介绍一个时间窗口,在此期间可用性可能会在任一方向发生变化。