Netty 클라이언트가 클라이언트 응용 프로그램과 서버 응용 프로그램 사이의 프록시 역할을하는 시나리오에서 Netty 4.0.19를 사용하고 ChannelOutboudHandler를 구현하려고합니다. 다음과 같이 보입니다.WebSocket과 함께 Netty에 ChannelOutboutHandler 구현
< 클라이언트 응용 프로그램> --- (웹 소켓) --------> < 웹 소켓 서버 = 전달 데이터 => Netty 클라이언트> ---- [netty 파이프 라인] - - [아웃 바운드 처리기 1] ----> < 서버 응용 프로그램>
두 개의 초기 메시지가 클라이언트 응용 프로그램과 서버 응용 프로그램간에 전달되며 두 개의 유형이 ChannelOutboundHandler가 필요합니다. 클라이언트와 서버 응용 프로그램 사이에있는 Netty 클라이언트는 이 교환되는 메시지의 유효성 검사를 담당합니다. 따라서 전달되는 메시지를 읽고 메시지의 내용을 검사하고 확인되면 클라이언트와 서버 응용 프로그램 간의 릴레이 통신을 설정합니다.
@Override
public void write(final ChannelHandlerContext ctx,
final Object msg,
final ChannelPromise promise)
throws Exception {
try {
buff = (ByteBuf) msg;
buff.order(ByteOrder.LITTLE_ENDIAN);
// TODO add the logic for readable bytes
ByteBuf helloBuff = null;
try {
helloBuff = buff.readBytes(Msg.SIZE).order(ByteOrder.LITTLE_ENDIAN);
Msg msg = new Msg(helloBuff);
} catch (Exception e) {
buff.release();
if (helloBuff != null) {
helloBuff.release();
}
log.error("Error while converting to a hello msg", e);
return;
}
ctx.writeAndFlush(helloBuff, promise)
.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE)
.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
if (future.isSuccess()) {
ctx.channel().flush();
} else {
future.channel().close();
}
}
});
final ChannelPipeline p = ctx.pipeline();
p.replace(this,AnotherHandler.class.getSimpleName(),
createAnotherHandler(ID));
} catch (Exception e) {
log.error("Error occured", e);
} finally {
buff.release();
}
}
을 그리고 두 번째 아웃 바운드 핸들러는 메시지의 다른 종류를 처리하고 단지 것을 꽤 비슷합니다
첫 번째 아웃 바운드 핸들러 (흥미로운 부분은) 다음과 같습니다 더 많은 수표를 추가합니다. 마지막으로
내 질문 :
1] 특정 시나리오의 두 번째 아웃 바운드 핸들러가 활성화되지 않습니다. 내 테스트에서 에 중단 점이있을 때 작동합니다. readableBytes() 확인을 추가하여 ByteBuff으로 객체를 변환하기 위해 인코더를 추가하려고합니다. 그게 도움이 될까요? 아니면 위 코드에서 누락 된 부분이 있습니까?
2] 두 번째 처리기의 쓰기가 서버 응용 프로그램에 도달하지 않습니다. 이 문제를 어떻게 디버그 할 수 있으며 어떤 포인터가 도움이 될 것입니다.
3] 클라이언트 응용 프로그램에서 아무 것도 쓰지 않아도 웹 사이트 서버에서 netty 클라이언트로 전달되는 "유령"데이터가 있음을 확인했습니다. 나는이 데이터가 어디에서 왔는지 확실하지 않다 ?
위의 질문 중 하나 이상을 자유롭게 답해주십시오.
프라 사나
@ norman-maurer 본인은 대부분의 게시물/프리젠 테이션/예를 읽거나 보았습니다. 매우 유용합니다. 그러나 ChannelOutboudHandlers에 대한 좋은 예를 찾을 수 없었습니다. 저에게 하나를 가르쳐 주시겠습니까? – Prasanna
@trustin 나는 당신의 게시물과 예제도 읽었다. 그러니 자유롭게 통찰력을 공유하십시오. – Prasanna