2012-04-17 3 views
3

저는 Netty의 초보자입니다. TCP 클라이언트가 때때로 가변 길이 이진 레코드 (16 진수)를 보내고 때때로 가변 길이 ASCII 레코드를 보낼 때 들어오는 TCP 데이터를 읽거나 처리하는 방법에 대해 궁금합니다. 캐리지 리턴 또는 줄 바꿈. 다음과 같이Netty를 사용하여 단일 포트에 다중 프로토콜 처리기를 작성하는 방법은 무엇입니까?

하는 TCP 클라이언트는 바이트 스트림을 보내는 :

  1. '$'로 시작하지만, 어떤 문자로 종료 변화하는 바이트의 수와하지를 가지고 있으며,

    바이트의 바이너리 스트림
  2. 시작 '('와 함께 끝 ')'하지만, 다양한 수의 바이트를 가지고 있으며, 모든 문자

모두 자체에 의해 종료되지 바이트의 ASCII 스트림 ts의 레코드가 같은 포트에 도착합니다.

Netty 기반 TCP 서버를 처리/읽으려면 어떻게해야합니까?

미리 감사드립니다.

쿠날

답변

0

먼저 모든 것을 조합해서 사용하지 마십시오. '$'는 Char입니다. 대부분의 인코딩에서 하나의 Byte로 표현할 수 있지만, 일반적인 문자의 경우는 거의 없습니다 (UTF-8에서는 char 인코딩되고 1, 2 또는 3 바이트를 사용할 수 있음).

스트림 길이에 따라 다릅니다. (타입에 대한 바이트

  • 한 바이트 또는 : 그것은가 송신자의 메모리 내부 착용감과 사용하는 프레임이다 수 있다면

    1) 쉬운 용액, 두 필드 헤더 문자열)

  • 2 프레임의 길이 (데이터의 바이트 수)에 대해 2 바이트 (예 : 부호없는 Int16 사용).

프레임 디코더를 사용하여 전체 프레임을 수신하고 디코딩 할 수 있습니다.

2) 스트림이 거대하고 메모리 내부에 맞지 않으면, 당신은 두 가지 해결책이 있습니다 프레임에

  • 분할 스트림 (약간의 오버 헤드 때문에 각 프레임의 헤더를)
  • 사용 Channel.close() 이벤트는 쉽게하지만 새로운 연결을 생성하고 또 다시 일부 핸드 쉐이킹을해야 할 경우 대기 시간 문제가 발생할 수 EndOfStream를 (통보합니다 ...

는 모든 경우의 Netty는 문자열을 스트리밍 일부 StringEncoderStringDecoder을 prodives. 또한 일부 FrameDecoderFrameEncoder 모든 종류의 유용한 헤더가 있습니다.

관련 문제