2016-11-17 2 views
1

다음과 같은 서버 및 클라이언트 이니셜 라이저 (클라이언트의 sch이 각각 cch으로 변경되는 매우 유사한 코드가 있습니다. 둘 다 각각의 처리기를 나타냄). 클라이언트 또는 서버에 명령/작업을 보낼 때프로토콜 버퍼 및 Netty 사용 4.1.6

@Override 
    public void initChannel(SocketChannel ch) throws Exception { 
     ch.pipeline().addLast("handler", sch); 
     ch.pipeline().addLast(new CommonClassHandler()); 
     ch.pipeline().addLast("frameDecoder", 
        new ProtobufVarint32FrameDecoder()); 
     ch.pipeline().addLast("protobufDecoder", 
        new ProtobufDecoder(Server.MyMessage.getDefaultInstance())); 
     ch.pipeline().addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender()); 
     ch.pipeline().addLast("protobufEncoder", new ProtobufEncoder()); 
    } 

나는 그러므로 나는 구글의 Protocol Buffers를 사용하고, 바이너리 형식을 사용하고 싶습니다.

while (channel.isOpen()) { 
     Client.MyMessage.Builder builder = Client.MyMessage.newBuilder(); 
     String input = in.readLine(); // Save console input 
     builder.setKeyword(input);  // Set the value of keyword to said input 
     channel.writeAndFlush(builder.build()); // Send the build to the server 
    } 

그리고 마지막으로 여기에 서버/클라이언트가 메시지를받을 때 자동으로 호출하는 방법입니다 :

@Override 
    public void channelRead(ChannelHandlerContext ctx, Object msg) { 
     ByteBuf bb = (ByteBuf)msg; 
     String order = bb.toString(Charset.defaultCharset()); 
     System.out.println(order); // Displays received data 

     Server.MyMessage.Builder builder = Server.MyMessage.newBuilder(); 
     builder.setKeyword("301"); 
     ctx.writeAndFlush(builder.build()); 
} 

일을 내가 builder을 만들 경우 클라이언트의 입력을 처리 할 때 다음

입니다) 내 ByteBuf의 내용을 표시 할 때 내 메시지 앞에 두 개의 알 수없는 문자와 "\ n"이 표시됩니다. 어쩌면 정상적인 디스플레이를 갖기 위해받은 데이터를 다르게 처리해야합니까?

2) 수신 된 데이터를 표시 한 후, 내 서버 내 고객에 대한 답변 "301"를 보내야한다, 그러나 나의 클라이언트가 아무 것도 표시하지 않는 한 아무 소용로, (이 방법은 심지어 클라이언트 핸들러에서 호출되지 않습니다) 명백한 이유가 있습니까?

제 질문은 실례지만 Netty 4.1.6을 사용하는 프로토콜 버퍼 사용에 관한 문서는 거의 없습니다.

답변

0

파이프 라인 시작 부분에 처리기를 추가하고 있지만, protobufDecoder 이후에 파이프 라인의 끝에 넣어야합니다.

변경 한 후 MyMessagemsg 대신 ByteBuf으로 시작해야합니다. 지금보고있는 알 수없는 문자는 프레임 디코더가 제거한 프레임 길이이지만 처리기가 끝나기 전까지는 실행되지 않습니다.

+0

나는 바보가되어서 문서를 철저히 읽어야합니다. 고맙습니다 ! –