2009-07-29 63 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執行網絡活動。這可能已被意外拒絕。