1、建立Personproto.protojava
建立Personproto.proto文件bootstrap
syntax = "proto2"; package com.example.protobuf; option optimize_for = SPEED; option java_package = "com.example.sixthexample"; option java_outer_classname = "MyDataInfo"; message Person{ required string name = 1; optional int32 age = 2; optional string address = 3; }
二、從新生成socket
D:\workspace\study\basic\netty_demo>protoc --java_out=src/main/java src/protobuf/Person.protoide
2、建立Netty服務端代碼oop
一、TestServer 類測試
public class TestServer { public static void main(String[] args) throws Exception{ EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try{ ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.INFO)) //增長日誌處理器 .childHandler(new TestServerInitializer()); ChannelFuture channelFuture = serverBootstrap.bind(8899).sync(); channelFuture.channel().closeFuture().sync(); }finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } }
二、TestServerHandle類ui
public class TestServerHandle extends SimpleChannelInboundHandler<MyDataInfo.Person> { @Override protected void channelRead0(ChannelHandlerContext ctx, MyDataInfo.Person msg) throws Exception { System.out.println("---- 服務端接收到消息 ----"); System.out.println(msg.getName()); System.out.println(msg.getAge()); System.out.println(msg.getAddress()); } }
三、TestServerInitializer 類spa
public class TestServerInitializer extends ChannelInitializer<SocketChannel>{ protected void initChannel(SocketChannel socketChannel) throws Exception { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new ProtobufVarint32FrameDecoder()); pipeline.addLast(new ProtobufDecoder(MyDataInfo.Person.getDefaultInstance())); pipeline.addLast(new ProtobufVarint32LengthFieldPrepender()); pipeline.addLast(new ProtobufEncoder()); pipeline.addLast(new TestServerHandle()); } }
3、建立客戶端代碼日誌
一、TestClient 類netty
public class TestClient { public static void main(String[] args) throws Exception{ EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) .handler(new TestClientInitializer()); ChannelFuture channelFuture = bootstrap.connect("localhost",8899).sync(); channelFuture.channel().closeFuture().sync(); }finally { eventLoopGroup.shutdownGracefully(); } } }
二、TestClientHandle 類
public class TestClientHandle extends SimpleChannelInboundHandler<MyDataInfo.Person> { // 對於客戶端來講,輸入來自控制檯 @Override protected void channelRead0(ChannelHandlerContext ctx, MyDataInfo.Person msg) throws Exception { } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { //客戶端啓動後,將消息發送給服務端 MyDataInfo.Person person = MyDataInfo.Person.newBuilder() .setName("張三").setAge(30).setAddress("上海").build(); ctx.channel().writeAndFlush(person); } }
三、TestClientInitializer 類
public class TestClientInitializer extends ChannelInitializer<SocketChannel> { protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new ProtobufVarint32FrameDecoder()); pipeline.addLast(new ProtobufDecoder(MyDataInfo.Person.getDefaultInstance())); pipeline.addLast(new ProtobufVarint32LengthFieldPrepender()); pipeline.addLast(new ProtobufEncoder()); pipeline.addLast(new TestClientHandle()); } }
4、測試
一、啓動服務端
二、啓動客戶端
三、服務端輸出