2015-12-29 28 views
0

嗨java.net.ConnectException/java.net.ConnectException我試圖發送一個二進制信息到服務器的IP和端口:取決於正常運行或調試模式

192.168.2.101:10001

每50封郵件重新打開一次套接字。

如果我正常運行應用程序,我會在第5行中得到一個java.net.ConnectException,儘管我可以ping和telnet服務器。

如果我調試應用程序,我得到一個java.net.SocketException在不同的行(11),有時第一條消息似乎通過沒有任何錯誤。

private void sendMessage(String message, int relaisId, long timestamp) { 

    try { 
     if (connCount > 50) { 
      s = new Socket(ip, port); //RUN NORMALLY: java.net.ConnectException: Connection refused: connect 
      connCount=0; 
     } 
     outputStream = s.getOutputStream(); 

     outputStream.write(message.getBytes()); 
     outputStream.write(new byte[]{0});//DEBUG: java.net.SocketException: Connection reset by peer: socket write error 
     outputStream.flush(); 
     connCount++; 
    } catch (UnknownHostException ex) { 
     logger.error("Host not found: " + ip + ":" + port, ex); 
     connCount=51; 
     retryMessage(message, relaisId, timestamp);// basically sleep 3s then call sendMessage 
    } catch (IOException ex) { 
     logger.error("Error at Relais No. " + relaisId + ": " + ip + ":" + port, ex); 
     connCount=51; 
     retryMessage(message, relaisId, timestamp); // basically sleep 3s then call sendMessage 
    } finally { 
     try { 
      if (connCount > 50 && s != null) { 
       s.close();      
      } 
     } catch (IOException ex) { 
      logger.error("IOException", ex); 
     } 
    } 
} 

任何幫助或分析工具都非常讚賞:)

回答

0

我找到了解決辦法。在我的程序中,不同的線程通過給定的IP和端口向外部硬件組件發送消息。 發生此錯誤是因爲線程意外地使用相同的IP地址和端口啓動了兩次,導致使用相同套接字時的計時衝突。

更奇怪的是,這個錯誤在更換服務器的機器時開始發生,在它只是偶爾出現之前,我們認爲這是網絡通信中的一種噪音。

希望這是對未來任何人的幫助:)

相關問題