UDP 서버 구성 중 Decoder 개발 문의

128 views
Skip to first unread message

Myungkyu Jung

unread,
Sep 17, 2019, 1:06:39 AM9/17/19
to Netty Korean User Group
안녕하세요.

Netty로 TCP서버 구성해보아서 이번엔 UDP서버를 구성해보고자 합니다.

전문이 가변길이라 decode 에서 전문전체길이 추출해서  다 읽은 다음에 리턴하려고 합니다.

똑같은 방법으로 TCP에서는 잘 작동하길래 UDP서버에서 Decoder를 만들어 해보려고 했으나

제대로 동작하지를 않아 전문가님들께 도움을 요청 드립니다 ㅠ.ㅠ



public class UDPBufferDecoder extends MessageToMessageDecoder<DatagramPacket> {
private static final Logger logger = LoggerFactory.getLogger(UDPBufferDecoder.class);

@Override
protected void decode(ChannelHandlerContext ctx, DatagramPacket in, List<Object> out) throws Exception {
int bufLen = in.content().readableBytes();
// set msg.header.size
int headerLen=4;

// read again if read buffer is smaller than header
if(bufLen<headerLen){
return;
}

// get total message length
byte[] headerB=new byte[headerLen];
in.content().readBytes(headerB);
int bodyLen = Integer.parseInt(new String(headerB));
int msgLen = headerLen + bodyLen; // header + body
logger.debug("bufLen={}, getMessageLength()={}", bufLen, msgLen);
// read buffer until msgLen
if(bufLen < msgLen){
in.content().resetReaderIndex(); // move to first index or marked index.
return;
}

in.content().resetReaderIndex();
out.add(in.content().readBytes(msgLen));
}
}



TCP에서는 버퍼사이즈보다 전문이 길면 위 decode가 여러번 호출되면서 다 읽은 뒤 리턴을 해줬는데
위의 UDP용으로 만든 decode에서는 한번만 호출 됩니다.ㅠ.ㅠ

제가 어딘가 UDP용 decode를 잘못 사용하고 있는 것 같은데 도움 주시면 감사 드리겠습니다.

< 사용하고 있는 netty 버전: 4.1.41>
Message has been deleted
Message has been deleted
Message has been deleted

Joo Sing

unread,
Feb 8, 2021, 11:14:55 PM2/8/21
to Netty Korean User Group
안녕하세요. Netty 초보라, 질문들을 둘러보며 간접 경험을 쌓고 있는데요. 

TCP 프로토콜은 Stream-Oriented 프로토콜이라 님께서 하신대로 메시지를 직접 추출(?)해주어야 하는게 맞는데요. (공부중이긴 하지만 LengthFieldBasedFrameDecoder 를 쓰면 지정한 위치에 지정한 크기만큼 가변길이 메시지 길이 값을 읽어서 동적으로 변경되는 메시지를 추출해 주는 것으로 보입니다. Netty 정말 훌륭한 프레임워크라고 생각해요. )

 UDP는  message-oriented 프로토콜입니다. 즉 UDP는 Sender가 100바이트를 보내면, UDP는 Send한 100바이트를 하나의 메시지르 인식하고 Receiver는 한 번의 read로 100바이트를 한 번에 수신할 수 있다는 뜻입니다. 보낼수 있는 길이가 65,507바이트로 제한(vxWorks라는 특수한 OS에서 확인)은 있지만 아무튼 그렇습니다. 

도움이 되면 좋겠네요. 

2019년 9월 17일 화요일 오후 2시 6분 39초 UTC+9에 taeb...@gmail.com님이 작성:
Reply all
Reply to author
Forward
0 new messages