-
IDEA安装插件
-
mac电脑通过brew安装ptotoc命令
brew install protobuf
protoc --version
-
pom增加依赖
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.7.1</version> </dependency>
-
编写DataInfo.proto文件
syntax = "proto3";
option java_package = "com.ptest.proto";
option java_outer_classname = "PersonModel";
message Person {
int32 id = 1;
string name = 2;
string email = 3;
}
-
生成POJO的java文件
在IDEA的命令窗口输入:protoc --java_out=生成的java文件路径 proto文件路径
然后到生成的java文件路径中找到生成的POJO文件PersonModel.java,并复制到项目中
// Generated by the protocol buffer compiler. DO NOT EDIT! // source: proto/DataInfo.proto public final class PersonModel { private PersonModel() {} public static void registerAllExtensions( com.google.protobuf.ExtensionRegistryLite registry) { } public static void registerAllExtensions( com.google.protobuf.ExtensionRegistry registry) { registerAllExtensions( (com.google.protobuf.ExtensionRegistryLite) registry); } public interface PersonOrBuilder extends // @@protoc_insertion_point(interface_extends:Person) com.google.protobuf.MessageOrBuilder { /** * <code>int32 id = 1;</code> */ int getId(); /** * <code>string name = 2;</code> */ java.lang.String getName(); /** * <code>string name = 2;</code> */ com.google.protobuf.ByteString getNameBytes(); /** * <code>string email = 3;</code> */ java.lang.String getEmail(); /** * <code>string email = 3;</code> */ com.google.protobuf.ByteString getEmailBytes(); } /** * Protobuf type {@code Person} */ public static final class Person extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:Person) PersonOrBuilder { private static final long serialVersionUID = 0L; // Use Person.newBuilder() to construct. private Person(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { super(builder); } private Person() { name_ = ""; email_ = ""; } @java.lang.Override public final com.google.protobuf.UnknownFieldSet getUnknownFields() { return this.unknownFields; } private Person( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { this(); if (extensionRegistry == null) { throw new java.lang.NullPointerException(); } int mutable_bitField0_ = 0; com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); try { boolean done = false; while (!done) { int tag = input.readTag(); switch (tag) { case 0: done = true; break; case 8: { id_ = input.readInt32(); break; } case 18: { java.lang.String s = input.readStringRequireUtf8(); name_ = s; break; } case 26: { java.lang.String s = input.readStringRequireUtf8(); email_ = s; break; } default: { if (!parseUnknownField( input, unknownFields, extensionRegistry, tag)) { done = true; } break; } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { throw e.setUnfinishedMessage(this); } catch (java.io.IOException e) { throw new com.google.protobuf.InvalidProtocolBufferException( e).setUnfinishedMessage(this); } finally { this.unknownFields = unknownFields.build(); makeExtensionsImmutable(); } } public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return com.zeng.nio.netty.protoBuf.PersonModel.internal_static_Person_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { return com.zeng.nio.netty.protoBuf.PersonModel.internal_static_Person_fieldAccessorTable .ensureFieldAccessorsInitialized( com.zeng.nio.netty.protoBuf.PersonModel.Person.class, com.zeng.nio.netty.protoBuf.PersonModel.Person.Builder.class); } public static final int ID_FIELD_NUMBER = 1; private int id_; /** * <code>int32 id = 1;</code> */ public int getId() { return id_; } public static final int NAME_FIELD_NUMBER = 2; private volatile java.lang.Object name_; /** * <code>string name = 2;</code> */ public java.lang.String getName() { java.lang.Object ref = name_; if (ref instanceof java.lang.String) { return (java.lang.String) ref; } else { com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; java.lang.String s = bs.toStringUtf8(); name_ = s; return s; } } /** * <code>string name = 2;</code> */ public com.google.protobuf.ByteString getNameBytes() { java.lang.Object ref = name_; if (ref instanceof java.lang.String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); name_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } public static final int EMAIL_FIELD_NUMBER = 3; private volatile java.lang.Object email_; /** * <code>string email = 3;</code> */ public java.lang.String getEmail() { java.lang.Object ref = email_; if (ref instanceof java.lang.String) { return (java.lang.String) ref; } else { com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; java.lang.String s = bs.toStringUtf8(); email_ = s; return s; } } /** * <code>string email = 3;</code> */ public com.google.protobuf.ByteString getEmailBytes() { java.lang.Object ref = email_; if (ref instanceof java.lang.String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); email_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { byte isInitialized = memoizedIsInitialized; if (isInitialized == 1) return true; if (isInitialized == 0) return false; memoizedIsInitialized = 1; return true; } @java.lang.Override public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { if (id_ != 0) { output.writeInt32(1, id_); } if (!getNameBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_); } if (!getEmailBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 3, email_); } unknownFields.writeTo(output); } @java.lang.Override public int getSerializedSize() { int size = memoizedSize; if (size != -1) return size; size = 0; if (id_ != 0) { size += com.google.protobuf.CodedOutputStream .computeInt32Size(1, id_); } if (!getNameBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_); } if (!getEmailBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, email_); } size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @java.lang.Override public boolean equals(final java.lang.Object obj) { if (obj == this) { return true; } if (!(obj instanceof com.zeng.nio.netty.protoBuf.PersonModel.Person)) { return super.equals(obj); } com.zeng.nio.netty.protoBuf.PersonModel.Person other = (com.zeng.nio.netty.protoBuf.PersonModel.Person) obj; if (getId() != other.getId()) return false; if (!getName() .equals(other.getName())) return false; if (!getEmail() .equals(other.getEmail())) return false; if (!unknownFields.equals(other.unknownFields)) return false; return true; } @java.lang.Override public int hashCode() { if (memoizedHashCode != 0) { return memoizedHashCode; } int hash = 41; hash = (19 * hash) + getDescriptor().hashCode(); hash = (37 * hash) + ID_FIELD_NUMBER; hash = (53 * hash) + getId(); hash = (37 * hash) + NAME_FIELD_NUMBER; hash = (53 * hash) + getName().hashCode(); hash = (37 * hash) + EMAIL_FIELD_NUMBER; hash = (53 * hash) + getEmail().hashCode(); hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseFrom( java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseFrom( java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input, extensionRegistry); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseDelimitedWithIOException(PARSER, input); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseDelimitedWithIOException(PARSER, input, extensionRegistry); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input, extensionRegistry); } @java.lang.Override public Builder newBuilderForType() { return newBuilder(); } public static Builder newBuilder() { return DEFAULT_INSTANCE.toBuilder(); } public static Builder newBuilder(com.zeng.nio.netty.protoBuf.PersonModel.Person prototype) { return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); } @java.lang.Override public Builder toBuilder() { return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); } @java.lang.Override protected Builder newBuilderForType( com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { Builder builder = new Builder(parent); return builder; } /** * Protobuf type {@code Person} */ public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements // @@protoc_insertion_point(builder_implements:Person) com.zeng.nio.netty.protoBuf.PersonModel.PersonOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return com.zeng.nio.netty.protoBuf.PersonModel.internal_static_Person_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { return com.zeng.nio.netty.protoBuf.PersonModel.internal_static_Person_fieldAccessorTable .ensureFieldAccessorsInitialized( com.zeng.nio.netty.protoBuf.PersonModel.Person.class, com.zeng.nio.netty.protoBuf.PersonModel.Person.Builder.class); } // Construct using com.zeng.nio.netty.protoBuf.PersonModel.Person.newBuilder() private Builder() { maybeForceBuilderInitialization(); } private Builder( com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); maybeForceBuilderInitialization(); } private void maybeForceBuilderInitialization() { if (com.google.protobuf.GeneratedMessageV3 .alwaysUseFieldBuilders) { } } @java.lang.Override public Builder clear() { super.clear(); id_ = 0; name_ = ""; email_ = ""; return this; } @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { return com.zeng.nio.netty.protoBuf.PersonModel.internal_static_Person_descriptor; } @java.lang.Override public com.zeng.nio.netty.protoBuf.PersonModel.Person getDefaultInstanceForType() { return com.zeng.nio.netty.protoBuf.PersonModel.Person.getDefaultInstance(); } @java.lang.Override public com.zeng.nio.netty.protoBuf.PersonModel.Person build() { com.zeng.nio.netty.protoBuf.PersonModel.Person result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } return result; } @java.lang.Override public com.zeng.nio.netty.protoBuf.PersonModel.Person buildPartial() { com.zeng.nio.netty.protoBuf.PersonModel.Person result = new com.zeng.nio.netty.protoBuf.PersonModel.Person(this); result.id_ = id_; result.name_ = name_; result.email_ = email_; onBuilt(); return result; } @java.lang.Override public Builder clone() { return super.clone(); } @java.lang.Override public Builder setField( com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { return super.setField(field, value); } @java.lang.Override public Builder clearField( com.google.protobuf.Descriptors.FieldDescriptor field) { return super.clearField(field); } @java.lang.Override public Builder clearOneof( com.google.protobuf.Descriptors.OneofDescriptor oneof) { return super.clearOneof(oneof); } @java.lang.Override public Builder setRepeatedField( com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { return super.setRepeatedField(field, index, value); } @java.lang.Override public Builder addRepeatedField( com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { return super.addRepeatedField(field, value); } @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { if (other instanceof com.zeng.nio.netty.protoBuf.PersonModel.Person) { return mergeFrom((com.zeng.nio.netty.protoBuf.PersonModel.Person)other); } else { super.mergeFrom(other); return this; } } public Builder mergeFrom(com.zeng.nio.netty.protoBuf.PersonModel.Person other) { if (other == com.zeng.nio.netty.protoBuf.PersonModel.Person.getDefaultInstance()) return this; if (other.getId() != 0) { setId(other.getId()); } if (!other.getName().isEmpty()) { name_ = other.name_; onChanged(); } if (!other.getEmail().isEmpty()) { email_ = other.email_; onChanged(); } this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @java.lang.Override public final boolean isInitialized() { return true; } @java.lang.Override public Builder mergeFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { com.zeng.nio.netty.protoBuf.PersonModel.Person parsedMessage = null; try { parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { parsedMessage = (com.zeng.nio.netty.protoBuf.PersonModel.Person) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { if (parsedMessage != null) { mergeFrom(parsedMessage); } } return this; } private int id_ ; /** * <code>int32 id = 1;</code> */ public int getId() { return id_; } /** * <code>int32 id = 1;</code> */ public Builder setId(int value) { id_ = value; onChanged(); return this; } /** * <code>int32 id = 1;</code> */ public Builder clearId() { id_ = 0; onChanged(); return this; } private java.lang.Object name_ = ""; /** * <code>string name = 2;</code> */ public java.lang.String getName() { java.lang.Object ref = name_; if (!(ref instanceof java.lang.String)) { com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; java.lang.String s = bs.toStringUtf8(); name_ = s; return s; } else { return (java.lang.String) ref; } } /** * <code>string name = 2;</code> */ public com.google.protobuf.ByteString getNameBytes() { java.lang.Object ref = name_; if (ref instanceof String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); name_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } /** * <code>string name = 2;</code> */ public Builder setName( java.lang.String value) { if (value == null) { throw new NullPointerException(); } name_ = value; onChanged(); return this; } /** * <code>string name = 2;</code> */ public Builder clearName() { name_ = getDefaultInstance().getName(); onChanged(); return this; } /** * <code>string name = 2;</code> */ public Builder setNameBytes( com.google.protobuf.ByteString value) { if (value == null) { throw new NullPointerException(); } checkByteStringIsUtf8(value); name_ = value; onChanged(); return this; } private java.lang.Object email_ = ""; /** * <code>string email = 3;</code> */ public java.lang.String getEmail() { java.lang.Object ref = email_; if (!(ref instanceof java.lang.String)) { com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; java.lang.String s = bs.toStringUtf8(); email_ = s; return s; } else { return (java.lang.String) ref; } } /** * <code>string email = 3;</code> */ public com.google.protobuf.ByteString getEmailBytes() { java.lang.Object ref = email_; if (ref instanceof String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); email_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } /** * <code>string email = 3;</code> */ public Builder setEmail( java.lang.String value) { if (value == null) { throw new NullPointerException(); } email_ = value; onChanged(); return this; } /** * <code>string email = 3;</code> */ public Builder clearEmail() { email_ = getDefaultInstance().getEmail(); onChanged(); return this; } /** * <code>string email = 3;</code> */ public Builder setEmailBytes( com.google.protobuf.ByteString value) { if (value == null) { throw new NullPointerException(); } checkByteStringIsUtf8(value); email_ = value; onChanged(); return this; } @java.lang.Override public final Builder setUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { return super.setUnknownFields(unknownFields); } @java.lang.Override public final Builder mergeUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { return super.mergeUnknownFields(unknownFields); } // @@protoc_insertion_point(builder_scope:Person) } // @@protoc_insertion_point(class_scope:Person) private static final com.zeng.nio.netty.protoBuf.PersonModel.Person DEFAULT_INSTANCE; static { DEFAULT_INSTANCE = new com.zeng.nio.netty.protoBuf.PersonModel.Person(); } public static com.zeng.nio.netty.protoBuf.PersonModel.Person getDefaultInstance() { return DEFAULT_INSTANCE; } private static final com.google.protobuf.Parser<Person> PARSER = new com.google.protobuf.AbstractParser<Person>() { @java.lang.Override public Person parsePartialFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return new Person(input, extensionRegistry); } }; public static com.google.protobuf.Parser<Person> parser() { return PARSER; } @java.lang.Override public com.google.protobuf.Parser<Person> getParserForType() { return PARSER; } @java.lang.Override public com.zeng.nio.netty.protoBuf.PersonModel.Person getDefaultInstanceForType() { return DEFAULT_INSTANCE; } } private static final com.google.protobuf.Descriptors.Descriptor internal_static_Person_descriptor; private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_Person_fieldAccessorTable; public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { return descriptor; } private static com.google.protobuf.Descriptors.FileDescriptor descriptor; static { java.lang.String[] descriptorData = { "\n\024proto/DataInfo.proto\"1\n\006Person\022\n\n\002id\030\001" + " \001(\005\022\014\n\004name\030\002 \001(\t\022\r\n\005email\030\003 \001(\tB*\n\033com" + ".zeng.nio.netty.protoBufB\013PersonModelb\006p" + "roto3" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { public com.google.protobuf.ExtensionRegistry assignDescriptors( com.google.protobuf.Descriptors.FileDescriptor root) { descriptor = root; return null; } }; com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { }, assigner); internal_static_Person_descriptor = getDescriptor().getMessageTypes().get(0); internal_static_Person_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_Person_descriptor, new java.lang.String[] { "Id", "Name", "Email", }); } // @@protoc_insertion_point(outer_class_scope) }
-
客户端通过protobuf发送java对象
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.protobuf.ProtobufEncoder;
public class Client {
public static void main(String[] args) {
EventLoopGroup group=new NioEventLoopGroup();
try {
Bootstrap bootstrap=new Bootstrap()
.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
//1 客户端出站时用的编码器
pipeline.addLast(new ProtobufEncoder());
//2 自定义处理器:通道连接成功后发送pojo对象消息
pipeline.addLast(new SimpleChannelInboundHandler<PersonModel.Person>(){
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
PersonModel.Person person= PersonModel.Person.newBuilder().setId(1).setName("sam.zeng").setEmail("zeng@qq.com").build();
ctx.writeAndFlush(person);
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, PersonModel.Person msg) throws Exception {
System.out.println("id:"+msg.getId()+" name:"+msg.getName()+" email:"+msg.getEmail());
}
});
}
});
ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 9999).sync();
channelFuture.addListener(future -> {
if (future.isSuccess())
System.out.println("ok");
else
System.out.println("no");
});
channelFuture.channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
}
}
-
服务器端接收POJO对象消息
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.protobuf.ProtobufDecoder;
public class Server {
public static void main(String[] args){
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap()
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
//1 服务器端入站时解码
pipeline.addLast(new ProtobufDecoder(PersonModel.Person.getDefaultInstance()));
//2 自定义处理器:通道连接成功后接收pojo对象
pipeline.addLast(new SimpleChannelInboundHandler<PersonModel.Person>(){
@Override
protected void channelRead0(ChannelHandlerContext ctx, PersonModel.Person msg) throws Exception {
System.out.println("id:"+msg.getId()+" name:"+msg.getName()+" email:"+msg.getEmail());
}
});
}
});
ChannelFuture channelFuture = serverBootstrap.bind(9999).sync();
channelFuture.addListener(future -> {
if (future.isSuccess())
System.out.println("ok");
else
System.out.println("no");
});
channelFuture.channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}