다음과 같은 서버 및 클라이언트 이니셜 라이저 (클라이언트의 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을 사용하는 프로토콜 버퍼 사용에 관한 문서는 거의 없습니다.
나는 바보가되어서 문서를 철저히 읽어야합니다. 고맙습니다 ! –