0

我有几个节点使用 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 个被拒绝。我怀疑我尝试过的所有节点上都运行着防火墙,并且很确定该服务正在端口上运行。还有其他原因会引发此异常吗?谢谢!

4

2 回答 2

0

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

默认策略文件

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

于 2009-07-29T16:51:20.787 回答
0

在 Windows 下,您可能必须告诉 Windows 防火墙以允许 Java 进行网络活动。这可能是不小心被拒绝的。

于 2009-07-29T16:58:58.727 回答