2009-07-29 59 views
0

我有几个节点充当服务器和客户端使用Java的TCP套接字,即Socket和ServerSocket。每个节点使用持续连接与4到10个邻居进行通信。然而,有时一个节点(节点)可能会抛出尝试连接到另一个节点(节点2)当出现以下异常:Java:连接被拒绝,但netstat说不然

java.net.ConnectException:连接被拒绝

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

TCP 0 0(节点2):61685(节点1):55150 ESTABLISHED

然而,节点1抛出每次尝试连接时相同的异常。

将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个则被拒绝。我怀疑在我尝试过的所有节点上运行防火墙,并且非常确定服务在端口上运行。是否有其他原因会引发此异常?谢谢!

+0

是你的ConnectionHandler开始它自己的线程? – nos 2009-07-29 17:20:24

+0

是的,ConnectionHandler会启动一个新的线程,该线程会一直检查是否收到任何内容,并执行任何它需要的操作。 – thodinc 2009-07-30 08:33:11

+0

请显示确切的堆栈跟踪,包括指示发生异常的行。 – 2009-07-30 10:42:38

回答

0

你可能想检查你的java安全策略文件。

Default Policy File

可能有东西在里面防止您的JVM使用的端口/地址。

0

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