1. 클라이언트 측에서는 가변적인 데이터패킷(byte[]형태)를 메시지 형태로 전송합니다.
현재 버퍼링 기반의 통신이라면 필요한 기능은 메시지 행태로 messageReceived()
메소드가호출되게 하고 싶은데요 이렇게 기능 구현이 가능한 방법이 있습니까?
2. 아니면 버퍼링 방식이 아닌 통신채널에서 데이터가 전송되는 즉시 messageReceived()가
호출되도록 하는 방법이 있습니까? 가이드문서의 'Dealing with a Stream-based transport'
부분에서 데이터를 버퍼링해서 패킷길이만큼 모이면 메시지처럼 처리한다던지 하는 방법
를 사용할때는 전송된 메시지 중에서 잘못된 메시지(길이가 짧은 메시지)가 중간에 있다면
오류로 처리해야 하는데 버퍼링 된다면 다음 메시지와 겹쳐져 버려 둘다 메시지가 망가져
버리는 경우가 발생합니다. 처리 방법이 있을까요?
3 channel.write()를 통해 데이터 패킷을 전송하는데 OutputStream에서 flush()와 같은
역활을 하는 메소드나 또는 그런 기능구현이 가능한지요. 문서에 나온 'Dealing with
a Stream-based Transport' 부분을 읽어보고 응용해서 프로그램 해보았지만 이 부분은
메시지를 받는측에서의 처리인것 같아서 클라이언트 측면에서의 처리를 위한 방법이
있는지 질문드립니다.
저는 2번에 해당하는 사항만 ^^;
저는 클라이언트에서 고정길이로 된 전문만을 수신하는 데요.
즉, 저는 코덱(codec)중에서 FixedLengthFrameDecoder 를 사용하는데요.
저도 클라이언트에서 잘못된 길이의 데이터가 올라오면 계속 버퍼에 쌓여있기 때문에
그 다음요청에 앞에 데이터랑 뒤의 데이터랑 합해져서 그 길이가 되면 올라오더라구요.
그래서 전 다른 코덱을 만들어서 아래와 같이 했습니다.
@Override
protected Object decode(ChannelHandlerContext ctx, Channel
channel, ChannelBuffer buffer) throws Exception {
if (buffer.readableBytes() < frameLength) {
buffer.clear(); // 만약 읽을수 있는 길이가 지정된 프레임(Frame)의 길이 보다 작다면 채널버
퍼를 비운다.
return null;
} else {
return buffer.readBytes(frameLength);
}
}
이렇게 해서 아예 명시적으로 비워버렸습니다.
하여튼 이렇게 처리했는데, 되긴되서 사용하고 있습니다. ^^;
아니면 버퍼를 읽으면 버릴수 있기 때문에 버퍼를 들오온 길이 만큼 읽고, 핸들러에서 처리하지 않는
식으로 사용하면 어떨까도 생각해 봤는데, 하여튼 이런식으로 처리했습니다.
On 2009/12/07 11:19 am, 넷개구락지 wrote:
>
>
> On 12월1일, 오전11시51분, mwdev <surv...@naver.com> wrote:
>> 안녕하세요.
>> Netty를 기반으로 프로그램을 개발하려 하는데요. 질문이 있습니다.
>>
>> 1. 클라이언트 측에서는 가변적인 데이터패킷(byte[]형태)를 메시지 형태로 전송합니다.
>> 현재 버퍼링 기반의 통신이라면 필요한 기능은 메시지 행태로 messageReceived()
>> 메소드가호출되게 하고 싶은데요 이렇게 기능 구현이 가능한 방법이 있습니까?
잘 이해했는지 모르겠습니다만 유저 가이드에서처럼 FrameDecoder 를 사용하
시면 될 듯 합니다.
>>
>> 2. 아니면 버퍼링 방식이 아닌 통신채널에서 데이터가 전송되는 즉시 messageReceived()가
>> 호출되도록 하는 방법이 있습니까? 가이드문서의 'Dealing with a Stream-based transport'
>> 부분에서 데이터를 버퍼링해서 패킷길이만큼 모이면 메시지처럼 처리한다던지 하는 방법
>> 를 사용할때는 전송된 메시지 중에서 잘못된 메시지(길이가 짧은 메시지)가 중간에 있다면
>> 오류로 처리해야 하는데 버퍼링 된다면 다음 메시지와 겹쳐져 버려 둘다 메시지가 망가져
>> 버리는 경우가 발생합니다. 처리 방법이 있을까요?
이 경우 넷개구락지님과 유사하게 FrameDecoder 구현 시 예외 사항을 잘 처리
해주는 방법이 있습니다. 아니면 파이프라인에서 FrameDecoder 를 빼서 데이
터가 전송되는 즉시 messageReceived 가 호출되도록 할 수도 있습니다.
>> 3 channel.write()를 통해 데이터 패킷을 전송하는데 OutputStream에서 flush()와 같은
>> 역활을 하는 메소드나 또는 그런 기능구현이 가능한지요. 문서에 나온 'Dealing with
>> a Stream-based Transport' 부분을 읽어보고 응용해서 프로그램 해보았지만 이 부분은
>> 메시지를 받는측에서의 처리인것 같아서 클라이언트 측면에서의 처리를 위한 방법이
>> 있는지 질문드립니다.
Channel.write() 는 가능한 한 빨리 데이터를 플러쉬합니다. 버퍼링이 필요
하다면 직접 쓰기 버퍼를 관리하셔야 합니다. 별도의 핸들러로 작성하여 파
이프라인의 앞쪽에 넣어 주면 유용할 듯 하네요. 3.2.0.ALPHA2 에서 이 기능
을 제공하는 핸들러가 추가될 예정입니다.
> 저는 2번에 해당하는 사항만 ^^;
> 저는 클라이언트에서 고정길이로 된 전문만을 수신하는 데요.
> 즉, 저는 코덱(codec)중에서 FixedLengthFrameDecoder 를 사용하는데요.
> 저도 클라이언트에서 잘못된 길이의 데이터가 올라오면 계속 버퍼에 쌓여있기 때문에
> 그 다음요청에 앞에 데이터랑 뒤의 데이터랑 합해져서 그 길이가 되면 올라오더라구요.
> 그래서 전 다른 코덱을 만들어서 아래와 같이 했습니다.
> @Override
> protected Object decode(ChannelHandlerContext ctx, Channel
> channel, ChannelBuffer buffer) throws Exception {
> if (buffer.readableBytes() < frameLength) {
> buffer.clear(); // 만약 읽을수 있는 길이가 지정된 프레임(Frame)의 길이 보다 작다면 채널버
> 퍼를 비운다.
> return null;
> } else {
> return buffer.readBytes(frameLength);
> }
> }
>
> 이렇게 해서 아예 명시적으로 비워버렸습니다.
> 하여튼 이렇게 처리했는데, 되긴되서 사용하고 있습니다. ^^;
> 아니면 버퍼를 읽으면 버릴수 있기 때문에 버퍼를 들오온 길이 만큼 읽고, 핸들러에서 처리하지 않는
> 식으로 사용하면 어떨까도 생각해 봤는데, 하여튼 이런식으로 처리했습니다.
디코더 작성시에는 인수로 넘어온 버퍼의 readerIndex 가 0이 아닐 수도 있음
을 고려하는 것이 좋습니다. 즉, buffer.clear() 대신
buffer.skipBytes(buffer.readableBytes()); 가 맞습니다.
도움이 되셨길 빕니다.