Handler
服务端和客户端的Handler继承SimpleChannelInboundHandler,修改泛型为为protobuf里的对象,代码如下:
服务端:
public class ProtoServerHandler extends SimpleChannelInboundHandler<ProtoMessage.PersonTest> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, ProtoMessage.PersonTest msg) {
System.out.println( msg );
ctx.channel().writeAndFlush( msg );
}
}
客户端:
public class ProtoClientHandler extends SimpleChannelInboundHandler<ProtoMessage.PersonTest> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, ProtoMessage.PersonTest msg) {
System.out.println( msg );
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ProtoMessage.PersonTest test = ProtoMessage.PersonTest
.newBuilder()
.setName( "123456" )
.setId( 27 )
.build();
ctx.channel().writeAndFlush( test );
}
}
Initializer
服务端和客户端的Initializer都要添加Protobuf的编解码器,代码如下:
public class ProtoServerInitializer extends ChannelInitializer<SocketChannel>{
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
//解码器,通过Google Protocol Buffers序列化框架动态的切割接收到的ByteBuf
pipeline.addLast(new ProtobufVarint32FrameDecoder());
//服务器端接收的是客户端RequestUser对象,所以这边将接收对象进行解码生产实列
pipeline.addLast( new ProtobufDecoder( ProtoMessage.PersonTest.getDefaultInstance() ) );
//Google Protocol Buffers编码器
pipeline.addLast(new ProtobufVarint32LengthFieldPrepender());
//Google Protocol Buffers编码器
pipeline.addLast(new ProtobufEncoder());
pipeline.addLast(new ProtoServerHandler());
}
}