ByteToMessageDecoder 에서 readableBytes() 함수를 호출시 1024를 넘는 경우,

1,234 views
Skip to first unread message

khk...@ecstel.co.kr

unread,
Jul 26, 2015, 7:10:31 AM7/26/15
to Netty Korean User Group
서버를 구현하고 있습니다. 

클라이언트는 정해진 프로토콜로 무한 루프를 돌면서 계속해서 데이터를 보내고 서버는 이를 처리하게 되는 구조입니다.

보통 데이터는 60바이트인데.. ByteToMessageDecoder 에서 readableBytes() 함수를 호출해서 보면

처음부터 1024 바이트를 넘습니다. 이렇게 넘으면 Handler 쪽으로 넘어가지 않습니다.

1024를 넘지않으면 Handler가 잘 호출되어 처리가 됩니다.


그렇다고, 클라이언트측에 천천히 데이터를 보내라고 이야기 할 수 있는 것도 아니고

참.. 난감합니다. 

어떻게 처리를 해야하는지 의견 부탁드립니다.



public class MessageDecorder  extends ByteToMessageDecoder {
     protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {
System.out.println(" ==== decode ==== : " + buffer.readableBytes());
 
               .....
               out.add(new xxxxx()); 
     }
}

이희승 (Trustin Lee)

unread,
Jul 26, 2015, 11:02:35 PM7/26/15
to nett...@googlegroups.com
디코더 버그인 것 같습니다만 디코더 코드를 모두 봐야 확실히 알 수 있겠습니다
--
이 메일은 Google 그룹스 'Netty Korean User Group' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-ko+u...@googlegroups.com에 이메일을 보내세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.
 

레올로

unread,
Jul 27, 2015, 2:48:52 AM7/27/15
to Netty Korean User Group, khk...@ecstel.co.kr
답변 감사합니다.

전체 코드는 아래와 같습니다.

클라이언트에 60바이트 정도의 데이터를 무한루프(3만번) 돌면서 계속해서 보내는 상황입니다.

이걸 가지고 테스트를 해보면 Netty  로그 상으로 한, 2만4천번 까지는 정상적으로 처리가 됩니다.
그런데, 그 이후부터는 데이터가 들어오지 않습니다.
혹시나 싶어서 클라이언트에서 wireshark로 떠보면 2만4천번 정도에서 전송이 되지 않더군요.

이게 수/발신 버퍼의 사이즈 때문인지..

그리고, 연결된 소켓에서 다시 메시지를 보내면 처음에는 정상적으로 수신되다가
마지막쯤 가면 데이터가 중간 중간 빠져서 수신이 되더군요.
이 경우 클라이언트 wireshark를 확인해보지는 않았습니다.





public class MessageDecorder extends ByteToMessageDecoder {

/******************************************************
* Define
******************************************************/
private EAPIMessageFactory msgFact = null;
private State state = State.HEADER;
private int   bodylen = 0;
private enum State { HEADER, BODY }
public MessageDecorder() {
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {
switch(state) {
case HEADER :
buffer.markReaderIndex();
if(buffer.readableBytes() < EAPIMessage.HEADER_LEN) {
buffer.resetReaderIndex();
return;
}
byte hData[] = new byte[EAPIMessage.HEADER_LEN];
buffer.readBytes(hData);
msgFact = new EAPIMessageFactory();
msgFact.ParseMsgHead(ctx, 100, hData);
bodylen = msgFact.GetBodyLength();
state   = State.BODY;

case BODY :
// Body read
buffer.markReaderIndex();
if(buffer.readableBytes() < bodylen) {
buffer.resetReaderIndex();
return;
}

// Body Parse
byte bData[] = new byte[bodylen];
buffer.readBytes(bData);
msgFact.ParseMsgBody(bData, bodylen);
out.add(msgFact);
state = State.HEADER;
}
}
}




2015년 7월 26일 일요일 오후 8시 10분 31초 UTC+9, 레올로 님의 말:

김남철

unread,
Jul 27, 2015, 8:37:41 PM7/27/15
to nett...@googlegroups.com
public class MessageDecorder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx,
 ByteBuf buffer,
 List<Object> out) throws Exception {
if(buffer.readableBytes() < EAPIMessage.HEADER_LEN) {
return;
}
buffer.markReaderIndex();
byte hData[] = new byte[EAPIMessage.HEADER_LEN];
buffer.readBytes(hData);

msgFact = new EAPIMessageFactory();
msgFact.ParseMsgHead(ctx, 100, hData);
bodylen = msgFact.GetBodyLength();

// Body read
if(buffer.readableBytes() < bodylen) {
buffer.resetReaderIndex();
return;
}
// Body Parse
byte bData[] = new byte[bodylen];
buffer.readBytes(bData);
msgFact.ParseMsgBody(bData, bodylen);
out.add(msgFact);
}
}

2015년 7월 27일 오후 3:48, 레올로 <khk...@ecstel.co.kr>님이 작성:

--
이 메일은 Google 그룹스 'Netty Korean User Group' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-ko+u...@googlegroups.com에 이메일을 보내세요.
Reply all
Reply to author
Forward
0 new messages