2017-11-02 10 views
-2

PC의 다른 응용 프로그램이 동일한 원격 IP 주소에 연결되어 있으면 Java 응용 프로그램이 제대로 연결되지 않습니다.연결이 이미 사용 중일 때 자바가 nio SocketChannel 연결을 얻습니다.

소켓 채널을 닫지 않고 exits abruptly이 발생하는 경우에도 이러한 현상이 발생할 수 있습니다. 연결이 차단 될 수 있으며 후속 세션 중에 연결할 수 없습니다.

기본 OS의 연결 상태에 상관없이 내 프로그램이 100 % 시간을 연결하도록하려면 어떻게해야합니까? 나는 크로스 플랫폼 솔루션을 찾고

(윈도우 & 우분투)

public void connect() throws CommunicationIOException { 

    try { 

     if (isConnected()) { 
      return; 
     } 

     socket = SocketChannel.open(); 
     socket.socket().connect(new InetSocketAddress(getHostname(), getPort()), getConnectionTimeout()); 

     if (!isConnected()) { 
      throw new CommunicationIOException("Failed to establish the connection"); 
     } 

     socket.configureBlocking(false); 

    } catch (final IOException ex) { 

     throw new CommunicationIOException(
       "An error occurred while connecting to " + getHostname() + " on port " + getPort(), ex); 
    } 

} 

.

public boolean isConnected() { 
    if (socket == null) { 
     return false; 
    } else { 
     return socket.isConnected(); 
    } 
} 

. PC에서 다른 응용 프로그램이 동일한 원격 IP 주소에 연결되어있는 경우

public void close() throws CommunicationIOException { 

    if (socket != null) { 

     try { 

      socket.close(); 

     } catch (final IOException ex) { 

      throw new CommunicationIOException(
        MessageFormat.format(
          "An error occurred while attempting to close the connection to {}:{}", 
          getHostname(), getPort()), ex); 
     } 

    } 
} 
+0

모든 통찰력 (및 하향 투표)에 대해 감사합니다. 아직 해결되지 않았습니다! – klonq

+0

두 다운 폰트를 나에게 귀속시킨 것 같습니다. 여기 고객 한 분 한 분 downvote. 더 말도 안돼. – EJP

답변

0

, 자바 응용 프로그램이 제대로 연결되지 않습니다.

아니요. 서버가 부적절하게 프로그래밍되지 않은 한 그렇지 않습니다.

이것은 소켓 채널을 닫지 않고 갑자기 종료 될 때도 발생할 수 있습니다.

아니요. 부적절하게 프로그램되지 않은 한 다시 할 수 없습니다.

가 연결이

을 차단 될 수 없음은 할 수 없습니다.

이며 이후 세션 중에 연결할 수 없습니다.

아니요.

기본 OS의 연결 상태에 관계없이 내 프로그램이 100 % 시간을 연결하도록하려면 어떻게해야합니까?

100 % 보장 할 수는 없습니다. 그러나 위에서 말한 두려움은 근거가 없습니다.

+0

사실 당신은 잘못되지 않습니다 : java.net.ConnectException :에 의한 – klonq

+0

을 발생합니다 다음 두 가지 예외 중 하나 연결이 거부 : 더 자세한 정보는 \t sun.nio.ch.SocketChannelImpl.checkConnect (기본 방법)에서 \t에서 sun.nio.ch.SocketChannelImpl.finishConnect (SocketChannelImpl.java:717) \t at sun.nio.ch.SocketAdaptor.connect (SocketAdaptor.자바 : java.nio.channels.ClosedChannelException : sotec.automation.io.conn.tcp.TcpConnection.connect (TcpConnection.java:96) – klonq

+0

에서 \t는 111에 의한)에 sun.nio.ch.SocketChannelImpl \t 널 .finishConnect (SocketChannelImpl.java:698) \t at sun.nio.ch.SocketAdaptor.connect (SocketAdaptor.java:111) \t at sotec.automation.io.conn.tcp.TcpConnection.connect (TcpConnection.java:96)) – klonq