【问题标题】:Java: Connection refused but netstat says otherwiseJava:连接被拒绝,但 netstat 另有说明
【发布时间】:2010-12-10 23:32:36
【问题描述】:

我有几个节点作为服务器和客户端使用 Java 的 TCP 套接字,即 Socket 和 ServerSocket。每个节点使用持久连接与 4 到 10 个邻居进行通信。但是,有时一个节点(node1)在尝试连接到另一个节点(node2)时可能会抛出以下异常:

java.net.ConnectException:连接被拒绝

如果我在 node2 上运行 netstat,它表明已在适当的端口(在本例中为 61685)上与 node1 建立了 TCP 连接。

tcp 0 0 (node2):61685 (node1):55150 已建立

但是,node1 每次尝试连接时都会抛出相同的异常。

ServerSocket 创建如下:

void OpenRcvSocket(final int port) {
    Thread rcvthread = new Thread () {
            @Override
        public void run () {
            ServerSocket rcvlistener = null;
            boolean running = true;

            try {
                rcvlistener = new ServerSocket(port);
                while(running) {
                    Socket incoming = rcvlistener.accept();
                    new ConnectionHandler(incoming);
                }
            } catch (IOException ex) {
                System.out.println(ex);
            }

            finally {
                try {
                    rcvlistener.close();
                } catch (IOException ex) {
                    System.out.println(ex);
                }
            }
        }
    };
    rcvthread.start();

}

发送部分如下所示:

synchronized void SendMsg(String dest, Message myMsg) {
    PrintWriter printwr = SendingConnectionList.get(dest);
    try {
        if(printwr == null) {
            Socket sendsock = new Socket(dest, port);
            printwr = new PrintWriter(sendsock.getOutputStream(), true);
            SendingConnectionList.put(dest, printwr);
        }
        printwr.print(myMsg.MsgToString());
        printwr.flush();
    } catch (UnknownHostException ex) {
        System.out.println(dest+": "+ex);
    } catch (IOException ex) {
        System.out.println(dest+": "+ex);
    }
}

奇怪的是,这些节点通常不会拒绝所有传入的连接,因为在 10 个邻居中,实际上可能有 6 个能够连接,而 4 个被拒绝。我怀疑我尝试过的所有节点上都运行着防火墙,并且很确定该服务正在端口上运行。还有其他原因会引发此异常吗?谢谢!

【问题讨论】:

  • 你的 ConnectionHandler 是在启动它自己的线程吗?
  • 是的,ConnectionHandler 启动了一个新线程,该线程不断检查是否已收到任何内容并执行它需要做的任何事情。
  • 请显示确切的堆栈跟踪,包括指出异常发生的行。
  • 在Socket sendock = new Socket(dest, port);处拒绝连接时发生异常奇怪的是,交流通常是单向的,而不是另一种,而且只与少数邻居(不一定是全部)进行。

标签: java connection tcpclient


【解决方案1】:

您可能需要检查您的 java 安全策略文件。

Default Policy File

那里可能有一些东西阻止你的 JVM 使用端口/地址。

【讨论】:

  • 问题是,有时并非所有连接都不会被拒绝。一些节点设法连接,而其他节点则被拒绝。如果没有节点可以连接到该节点,则问题可能与节点阻塞连接本身有关。是否还有其他原因会引发此异常?
【解决方案2】:

在 Windows 下,您可能必须告诉 Windows 防火墙以允许 Java 进行网络活动。这可能被意外拒绝了。

【讨论】:

  • 所有节点都运行 Fedora 8.0 内核,因此除非节点所有者自己设置防火墙,否则不应该有任何防火墙。我目前正在使用 400 个节点,并且该应用程序设法在其中大约 320 个节点上运行而没有任何问题,但令人怀疑的是,80 个节点在不应该设置防火墙的情况下设置了防火墙。我已经向他们发送了电子邮件以了解是否是这种情况,但是否还有其他原因会发生这种情况,尤其是 netstat 显示为 ESTABLISHED 状态?
  • 在这种情况下,我会仔细调查该进程是否正在侦听所有网络接口,而只是一个。
  • 感谢您的回复。这些节点应该具有相同的硬件配置,而我检查的少数节点只有一个以太网接口、环回和一个分路接口。
  • 您应该检查该进程是否监听所有这些。这个很重要。否则,您可以拥有一个仅响应例如的进程。 localhost:8080 但不是 externalipname.com:8080。
  • 据我所知,当我声明一个只指定一个端口的新 ServerSocket 时,它会监听所有接口。此外,运行 netstat -an |听听 | grep tcp 向我展示了相同的内容: tcp 0 0 0.0.0.0:61694 0.0.0.0:* LISTEN 我仍然无法推断出为什么某些连接被拒绝而其他连接却没有。在这种情况下,问题不可能是防火墙,如果端口上没有运行服务,也不会接受任何连接。有没有可能我的 Sockets 和 ServerSockets 实现不允许太多的连接?谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-08-08
  • 2011-07-01
  • 2012-09-10
  • 2016-06-24
  • 2011-06-24
  • 1970-01-01
  • 2015-03-24
  • 2019-12-11
相关资源
最近更新 更多