2013-04-29 5 views
0

ustable 네트워크에서 작동 할 수있는 클라이언트 - 서버 시스템을 만들고 있습니다. 한 번에 연결이 끊어 질 수 있다고 가정하고 시스템은 다시 연결하여 작업을 계속해야합니다. 저는 Netty를 사용하고 문제가 생겼습니다. 우리가 보낸 메시지가 다른 호스트에 의해 수신되었음을 어떻게 알 수 있습니까?TCP Netty 메시지 수신 확인

사용할 수 나는이 목적 ChannelFuture에 대해 생각하고, 내가 단순히 부착 미래 리스너에 실패 할 경우 다시 메시지를 보내려고 수 있습니다 : 그 청취자,

ChannelFuture fut = channel.write(message); 
fut.addListener(new ChannelFutureListener() { 
     @Override 
     public void operationComplete(ChannelFuture future) throws Exception { 
      if (!future.isSuccess()) { 
       LOGGER.error("Message send failed. Message: " + message, future.getCause()); 
       //Queue message to be send after reconnect 
      } 
     } 
}); 

하지만 난이 완료되면, 내가 발견 절대로 오류를 인쇄하지 않습니다. (나는 시스템이 거의 작동하지 않을 때 네트워크에서 플러그를 뽑음으로써 이것을 테스트했다.) 또한 내가 보낸 메시지의 모든 미래가 '완료'상태가되며 메시지가 수신되었는지 확인하는 방법이 있다는 것을 알았다. (확인 메시지를 사용하지 않음)

알다시피, TCP 프로토콜은 메시지가 수신된다는 것을 보장하며, 작업 할 때 어떤 송신 패키지가 목적지에 도달했는지 알 수 있습니다. 나는 Netty가 그것을 알 수 없다는 것을 믿을 수 없다.

메시지가 배달되었음을 알 수있는 좋은 방법이 있습니까?

답변

2

당신은 TCP를 오해하고 있습니다. TCP는 귀하의 메시지가 수신되었음을 보장하지 않습니다. 신뢰할 수 있고 정렬 된 바이트 스트림을 제공합니다. 그것은 당신의 메시지에 대해 아무것도 모르고 그것이 원격 호스트에 의해 수신되었을 때 당신에게 말할 수 없습니다. 따라서 Netty도 마찬가지입니다. Netty는 메시지가 전송되기 전에 운영 체제 버퍼에 기록되었음을 알려줄뿐입니다. 이것이 귀하의 코드가 탐지하는 것입니다.

메시지를 수신했는지 확인하려면 수신자가 명시 적 승인을 다시 보내야합니다. 이를 달성하는 가장 좋은 방법은 프로토콜의 예상되는 동작에 따라 다르지만 일반적으로 전송되었지만 아직 확인되지 않은 모든 메시지의 테이블을 유지 관리하는 것입니다.

+0

TCP는 실제로 메시지 (또는 해당 바이트)가 TCP 소켓에 기록 된 경우 해당 메시지 (또는 그 바이트)가 결국 클라이언트 소켓으로 전달된다는 것을 보장합니다. 응용 프로그램 수준의 메시지는 알 수 없지만 메시지 배달을 보장합니다. 네트워크 또는 실제 계층에서 해결할 수없는 문제가 발생하면 적어도 실패한 메시지를 보내는 소켓에 알립니다. – Bhaskar

0

미래는 모두 네트워크에 메시지를 쓰는 것입니다.

수신을 보장하려면 수신 확인을 구현하거나 메시지 번호와 재전송 요청을 사용해야합니다.