나는 단지 Netty
으로 시작하고 있으니, 정말 바보 같으면 저와 함께하시기 바랍니다.Netty를 통해 서버에서 클라이언트로 메시지를 보낼 수 없습니다.
클라이언트에 성공적으로 연결되면 클라이언트에게 ping 메시지를 보내도록 서버에 요청합니다. 이를 위해 ChannelInboundHandlerAdapter
클래스의 channelActive
메서드를 재정의했습니다. 클라이언트가 서버에 연결하면 "연결된 클라이언트"가 인쇄 된 것을 볼 수 있지만 어떻게 든 서버는 클라이언트에 메시지를 보내지 않습니다. 나는 여기서 정말로 잘못된 것을하고 있다고 생각한다. 누구든지 나를 도울 수 있습니까? 여기
public class ChatServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(final ChannelHandlerContext ctx) {
System.out.println("client connected");
String msg = "ping";
final ChannelFuture f = ctx.writeAndFlush(msg);
f.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
if(future.isSuccess()) {
System.out.println("Wrote message on active");
}
}
});
}
클라이언트 코드 -
public class ChatClientHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
System.out.println("Msg: " + (String)msg);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
System.out.println("Exception...closing channel");
ctx.close();
}
}
문제는 내가 메시지가 channelRead()
에 클라이언트에서 인쇄되는 표시되지 않습니다, 그래서 서버가 클라이언트에 메시지를 전송하지 않았다고 가정합니다.
코드의 다른 부분도 필요하면 알려주십시오. Netty 4.0.21을 사용하고 있습니다.
감사합니다.
String-> ByteBuf의 인코딩을 처리 할 ChannelEncoder를 ChannelPipeline에 추가 할 수도 있습니다. –
그 조각을 주셔서 감사합니다 @ NormanMaurer! 사용 가능한 인코더 중 일부를 설명하는 사용 설명서가 있다면 알고 있습니까?'MessageToByteEncoder'(http://netty.io/wiki/user-guide-for-4.x.html#wiki-h3-15)를 사용하는 것 이외의 다른 것을 보지 못했습니다. 자세한 내용은 [StringEncoder] (http://netty.io/4.0/api/io/netty/handler/codec/string/StringEncoder.html)에서 확인할 수 있습니다. 다른 인코더는 [MessageToMessageEncoder] (http://netty.io/4.0/api/io/netty/handler/codec/MessageToMessageEncoder.html) 하위 클래스에서 볼 수 있습니다. – Doswell
입력에 감사하는 @NormanMaurer 및 업데이트 된 답변을위한 Doswell 매우 유용합니다. – gravetii