Java 是什么导致ch.ethz.ssh2.Connection出现挂起时间?

Java 是什么导致ch.ethz.ssh2.Connection出现挂起时间?,java,ssh,ganymede,Java,Ssh,Ganymede,我目前正在使用ch.ethz.ssh2.Connection连接到java中的服务器。有时它挂在一台服务器上(可能10-15秒)。我想知道是什么导致了这种挂起时间以及如何避免它 连接示例 conn = new ch.ethz.ssh2.Connection(serverName); conn.connect(); boolean isAuthenticated = conn.authenticateWithPassword(user, pass); logger

我目前正在使用ch.ethz.ssh2.Connection连接到java中的服务器。有时它挂在一台服务器上(可能10-15秒)。我想知道是什么导致了这种挂起时间以及如何避免它

连接示例

    conn = new ch.ethz.ssh2.Connection(serverName);
    conn.connect();

    boolean isAuthenticated = conn.authenticateWithPassword(user, pass);
    logger.info("Connecting to " + server);

    if (isAuthenticated == false) {
        logger.info(server + " Please check credentials");              
    } 

    sess = conn.openSession();

   // I am connecting to over 200 servers and closing them. What would be the best practice to loop thru all these servers in the minimal time.

//some servers quickly connects, while some takes some time.
why does this happen?

主要问题是:这是代码问题、网络问题还是服务器问题

可以调试代码问题-不幸的是,
ch.ethz.ssh2.Connection
没有任何日志记录的可能性来检测内部的情况

可能您应该考虑切换ssh库(或者将其用于有问题的服务器的一些测试)。从我的经验来看是非常有用的

如果是网络问题或服务器问题,您可以通过Wireshark检查发生了什么。如果发送了网络数据包,但响应延迟,则问题不是使用的客户端代码。

My告诉我服务器正在对连接的每个客户端的IP地址进行DNS查找。这些DNS查找要么需要很长时间才能完成,要么完全失败。DNS查找将阻止身份验证过程,直到它成功或失败完成


如果服务器是,则此行为由“UseDNS”选项控制。

我正在应用程序中使用executor服务。但我还有挂断的时间。我想知道服务器速度慢的原因。另外,我将threadpool设置为80,这会造成威胁吗?对于前面展示的executor服务,如果需要超过1000毫秒的时间,您将如何关闭线程?如果连接延迟或暂停,SSH库的任务是退出连接。通常,您可以设置连接超时和/或要执行的命令所需的最长时间。如果达到超时,库将退出连接,runnable将结束。此外,您可以监视TCP连接并从SSH连接的“外部”关闭它,这会导致所有其他操作失败。我做了一些研究,有人说这是不可能的,有人说使用中断(),future()
interrupt()
只有当线程正在等待某个东西或者它手动轮询
isInterrupted()
时才会起作用。第一种可能是这种情况,后者通常不使用。正如我所说,在处理网络连接时,最直接的方法是从线程外部关闭连接。如果关闭以良好的方式实现,它将关闭TCP连接并强制结束连接(线程也是如此)。它总是/经常是同一台服务器还是有所不同?@Robert主要在同一台服务器上,但有所不同。另外,在前面的threadpool示例中,是否存在最大限制?如何关闭需要较长时间连接的服务器?