通过套接字连接的Java套接字超时连接超时,但UNIX ping工具很好

时间:2014-07-08 11:05:45

标签: java linux unix networking

我有一台机器,我使用下面的脚本

import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

class SimplePing 
{
    static void connectAndPing(String host, int port, int loop, int pingLoop, int socketTimeout){
        if(loop>0){
            SocketAddress sAdress;
            Socket kkSocket;
            for(int i=0;i<loop;i++){
                sAdress = new InetSocketAddress(host, port);
                for(int j=0;j<pingLoop;j++){
                    try {
                      kkSocket = new Socket();
                      kkSocket.connect(sAdress, socketTimeout);
                      kkSocket.close();
                      Thread.sleep(1000L);
                    } catch (Exception e) {
                      System.out.println(e);        
                    }
                    System.out.print("!");
                }
            }
        }
    }


    public static void main(String[] args) 
    {

        String host = args[0];
        int port = Integer.parseInt(args[1]);
        int socketTimeout = Integer.parseInt(args[2]);
        int loop = 100000;
        int pingLoop = 100;

        System.out.println("Begin ping. . .");
        connectAndPing(host, port, loop, pingLoop, socketTimeout);
        System.out.println("End ping. . .");
    }
}

它给了我一些结果(不要打扰标记,只是我的评论) enter image description here

然后我尝试使用UNIX ping工具ping,并获取

enter image description here

这是远程机器信息:

** SunOS msgbkrpapp18 5.10 Generic_138888-03 sun4v sparc SUNW,SPARC-Enterprise-T5120

java版本&#34; 1.6.0_26&#34;

Java(TM)SE运行时环境(版本1.6.0_26-b03)

Java HotSpot(TM)服务器VM(版本20.1-b02,混合模式)**

为什么我会得到不同的结果?哪一个更有效?

端口8000正在被我的消息传递应用程序使用,它接受来自外部IP的连接,我的客户抱怨应用程序有时会关闭,他使用上面的java程序读取系统运行状况。

如果我在应用程序方面检查,没有遇到任何异常情况,即使连接的线程池也没有达到最大值。

有什么建议吗? 谢谢

3 个答案:

答案 0 :(得分:0)

答案在你的代码中:

int socketTimeout = 1000;
...
kkSocket.connect(sAdress, socketTimeout);

另一方在1秒内没有响应,所以你得到一个SocketTimeoutException。尝试增加超时。还有代码来处理异常 - 比如增加一个未应答ping的计数器。

答案 1 :(得分:0)

几天之后,我们设法找到了罪魁祸首,结果是操作系统级别的somaxconn属性,仍处于默认值(128),考虑到我们的大量爆发,我们建议客户端将数量配置为1000; < / p>

现在,拒绝连接的数量下降了98.15%,例如,我们可以在1天内得到近400次拒绝连接,现在,它可能会降到每天6-9次。

虽然我们仍在努力提供最佳的调整配置,但我想感谢各位给我一些建议:)

由于

答案 2 :(得分:-1)

这两个结果都是有效的,区别在于Unix ping不需要连接到服务器的特定端口。它看起来你的应用程序根本不会在给定的超时内发送任何响应。