当前位置: 首页 > 面试题库 >

Java InetAddress.isReachable()超时

弘柏
2023-03-14
问题内容

我试图找出网络上的特定主机是否可以访问。我的java代码如下:

InetAddress adr = InetAddress.getByName(host);
if(adr.isReachable(3000)){
    System.out.println(host + " is reachable");
}

这工作得很好,但是如果我将超时降低为500ms,它将不再指定可访问的主机。我计划在一个循环中检查很多主机,因此低超时非常重要。如果我从Windows命令行手动ping主机,则所需时间少于10ms。

那么,为什么Java方法需要更高的超时才能成功?有使用的替代方法isReachable()吗?


问题答案:

这取决于您所指的可达性。如果仅找到在特定端口上侦听的可访问主机,则可以打开与该端口的套接字连接(例如,通过检查端口80查找所有HTTP服务器)。使用InetAddress.isReachable()取决于实现。根据javadoc,“典型的实现将使用ICMP
ECHO REQUEST”。使用Java NIO(非阻塞I /
O)的“已知端口”检查(如http(80),smb(445)等)可以具有更高的性能。我公司的产品使用“已知端口”扫描来查找使用NIO运行Telnet或SSH的设备,并且我们可以扫描大约5000
IP / sec。




 类似资料:
  • 当我们所有数据库的 SQL 语句是通过子查询方式完成,对于超时的控制往往很容易被大家忽略。因为大家在代码里看不到任何调用 set_timeout 的地方。实际上 PostgreSQL 已经为我们预留好了两个设置。 请参考下面这段配置: location /postgres { internal; default_type text/html; set_by_lua_blo

  • 你是否正遇到网络或 CPU 的瓶颈? 验证客户端和托管redis-server的服务器上支持的最大带宽。如果有请求被带宽限制,则它们需要更长时间才能完成,从而可能导致超时。 同样,验证您没有在客户端或服务器框上获得CPU限制,这将导致请求等待CPU时间,从而超时。 有没有命令需要在 redis 服务器上处理很长时间? 可能有一些命令需要很长时间才能在redis服务器上处理,导致请求超时。 长时间

  • 套房级 套件级超时可应用于整个测试“套件”,或通过其禁用this.timeout(0)。这将由所有嵌套套件和不覆盖该值的测试用例继承。 describe('a suite of tests', function() { this.timeout(500); it('should take less than 500ms', function(done){ setTimeout(done, 30

  • 我使用命令生成器在Jenkins服务器上运行单元测试。phar exec“codecept运行单元应用程序/模型”-vvv并获取以下错误: [Symfony\Component\Process\Exception\ProcessTimedOutException] 进程“codecept运行单元应用程序/模型”超过了1800秒的超时时间。 我如何修复它并允许测试花费更多的时间?谢谢

  • 你知道是怎么回事吗?

  • 问题内容: 我正在使用SwingWorker通过TCP连接读取数据并在数据返回时显示。 当套接字失效时,例如在writeTo之后,它将永久等待套接字上的输入,从而产生问题。一段时间后最简单的超时方法是什么?是否这也是在这种情况下,最好的解决办法?在该解决方案中,我还会使用摇摆工人吗? 谢谢 问题答案: 是的,您链接到的解决方案是一个合理且简单的解决方案(“ best”太主观了:)您可以利用Swin

  • 示例: timeout 超时机制可以保护服务调用陷入无限的等待之中。超时定义了服务的最长等待时间,如果在给定的时间没有相应,服务调用就进入下一个状态,或者重试、或者立即返回错误。 Server 你可以使用OptionFn设置服务器的 readTimeout 和 writeTimeout。 ```go server struct type Server struct { …… readTimeout

  • 超时对那些连接外部资源的程序来说是很重要的,否则就需要限定执行时间。在Go里面实现超时很简单。我们可以使用channel和select很容易地做到。 package main import "time" import "fmt" func main() { // 在这个例子中,假设我们执行了一个外部调用,2秒之后将结果写入c1 c1 := make(chan string, 1)