2017-12-16 29 views
2

Netty을 사용하여 서버에 연결된 Java TCP 클라이언트가 있습니다. 연결이 끊어진 채널을 작성하면 예외가 발생합니다. 어떤 문제가이 문제의 원인인지는 중요하지 않지만 어떤 메시지가 이 아니고으로 전송되지 않았고 예외가 발생한 것이 중요합니다.Netty가 writting에서 어떤 메시지로 인해 예외가 발생하는지 알아내는 방법은 무엇입니까?

[ChannelPromise 또는 ChannelFuture를 사용하여 어떻게 찾을 수 있습니까?]

여기에 'f.isSuccess()==true'이 표시되지만 성공하지는 못했습니다. 메시지가 전송되지 않았습니다!

ChannelPromise promise = c.newPromise(); 
      promise.addListener(new ChannelFutureListener() { 
       @Override 
       public void operationComplete(ChannelFuture f) { 
        System.err.println("<TCPIn: promise write operationComplete."); 
        if (!f.isSuccess()) { 
         System.err.println("<TCPIn[writting]: promise write ERROR:"); 
         f.cause().printStackTrace(); 
         f.channel().close(); 
        } 
       } 
      }); 
channel.writeAndFlush(buf,promise); 
+0

리스너 자체에서 buf 객체에 액세스 할 수 없습니까? 이것은 대부분의 경우에 효과가 있지만 EJP가 그의 대답에서 말한 경우는 아닙니다 – Ferrybig

답변

1

그렇게 간단하지 않습니다. 예외를 일으킨 원인은 소켓 전송 버퍼에서 전송 된 세그먼트에 대한 수신 확인 실패입니다. 특정 메시지와의 상관 관계는 0 일 수 있습니다. 예를 들어 한 메시지의 절반이고 다음 메시지의 절반이 될 수도 있습니다. 그리고 방금 완성 된 데이터가 아닌 이전의 쓰기의 데이터 였을 것입니다. TCP에서 'write completion'은 소켓 송신 버퍼에있는 데이터를 성공적으로 버퍼링하는 것을 의미합니다.

+0

좋습니다. 그래서 메시지가 완전히 보내 졌는지 여부를 알아내는 방법? 메시지가 성공적으로 전송되었는지 알고 싶습니다. –

+2

실제로 뭔가가 TCP에서 성공적으로 수신되었는지 확인하는 유일한 방법은 "ACK 메시지"를 다시 보내는 것입니다. 이것은 프로토콜 자체의 일부이며 TCP 위에 구축됩니다. –

+0

@NormanMaurer 메시지 수신에 대해 알고 싶지 않습니다. 메시지가 성공적으로 전송되었는지 여부를 알고 싶습니다. –