欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Netty中Protobuf编解码应用 博客分类: NettyProtobuf NettyProtobuf

程序员文章站 2024-03-05 23:26:43
...
工程结构图如下:
Netty中Protobuf编解码应用
            
    
    博客分类: NettyProtobuf NettyProtobuf

SubscribeReqProto.java文件内容如下:
package com.shihuan.netty.codec.protobuf;

public final class SubscribeReqProto {

	private SubscribeReqProto() {
		
	}

	public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
		
	}
	
	public interface SubscribeReqOrBuilder extends com.google.protobuf.MessageOrBuilder {

		// required int32 subReqID = 1;
		/**
		 * <code>required int32 subReqID = 1;</code>
		 */
		boolean hasSubReqID();

		/**
		 * <code>required int32 subReqID = 1;</code>
		 */
		int getSubReqID();

		// required string userName = 2;
		/**
		 * <code>required string userName = 2;</code>
		 */
		boolean hasUserName();

		/**
		 * <code>required string userName = 2;</code>
		 */
		java.lang.String getUserName();

		/**
		 * <code>required string userName = 2;</code>
		 */
		com.google.protobuf.ByteString getUserNameBytes();

		// required string productName = 3;
		/**
		 * <code>required string productName = 3;</code>
		 */
		boolean hasProductName();

		/**
		 * <code>required string productName = 3;</code>
		 */
		java.lang.String getProductName();

		/**
		 * <code>required string productName = 3;</code>
		 */
		com.google.protobuf.ByteString getProductNameBytes();

		// repeated string address = 4;
		/**
		 * <code>repeated string address = 4;</code>
		 */
		java.util.List<java.lang.String> getAddressList();

		/**
		 * <code>repeated string address = 4;</code>
		 */
		int getAddressCount();

		/**
		 * <code>repeated string address = 4;</code>
		 */
		java.lang.String getAddress(int index);

		/**
		 * <code>repeated string address = 4;</code>
		 */
		com.google.protobuf.ByteString getAddressBytes(int index);
	}
	
	/**
	 * Protobuf type {@code netty.SubscribeReq}
	 */
	public static final class SubscribeReq extends com.google.protobuf.GeneratedMessage implements SubscribeReqOrBuilder {
		// Use SubscribeReq.newBuilder() to construct.
		private SubscribeReq(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
			super(builder);
			this.unknownFields = builder.getUnknownFields();
		}

		private SubscribeReq(boolean noInit) {
			this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance();
		}

		private static final SubscribeReq defaultInstance;

		public static SubscribeReq getDefaultInstance() {
			return defaultInstance;
		}

		public SubscribeReq getDefaultInstanceForType() {
			return defaultInstance;
		}

		private final com.google.protobuf.UnknownFieldSet unknownFields;

		@java.lang.Override
		public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
			return this.unknownFields;
		}

		private SubscribeReq(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
			initFields();
			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;
						default: {
							if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
								done = true;
							}
							break;
						}
						case 8: {
							bitField0_ |= 0x00000001;
							subReqID_ = input.readInt32();
							break;
						}
						case 18: {
							bitField0_ |= 0x00000002;
							userName_ = input.readBytes();
							break;
						}
						case 26: {
							bitField0_ |= 0x00000004;
							productName_ = input.readBytes();
							break;
						}
						case 34: {
							if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
								address_ = new com.google.protobuf.LazyStringArrayList();
								mutable_bitField0_ |= 0x00000008;
							}
							address_.add(input.readBytes());
							break;
						}
					}
				}
			} catch (com.google.protobuf.InvalidProtocolBufferException e) {
				throw e.setUnfinishedMessage(this);
			} catch (java.io.IOException e) {
				throw new com.google.protobuf.InvalidProtocolBufferException(e.getMessage()).setUnfinishedMessage(this);
			} finally {
				if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
					address_ = new com.google.protobuf.UnmodifiableLazyStringList(address_);
				}
				this.unknownFields = unknownFields.build();
				makeExtensionsImmutable();
			}
		}

		public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
			return com.shihuan.netty.codec.protobuf.SubscribeReqProto.internal_static_netty_SubscribeReq_descriptor;
		}

		protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() {
			return com.shihuan.netty.codec.protobuf.SubscribeReqProto.internal_static_netty_SubscribeReq_fieldAccessorTable.ensureFieldAccessorsInitialized(
					com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq.class,
					com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq.Builder.class);
		}

		public static com.google.protobuf.Parser<SubscribeReq> PARSER = new com.google.protobuf.AbstractParser<SubscribeReq>() {
			public SubscribeReq parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
				return new SubscribeReq(input, extensionRegistry);
			}
		};

		@java.lang.Override
		public com.google.protobuf.Parser<SubscribeReq> getParserForType() {
			return PARSER;
		}

		private int bitField0_;
		// required int32 subReqID = 1;
		public static final int SUBREQID_FIELD_NUMBER = 1;
		private int subReqID_;

		/**
		 * <code>required int32 subReqID = 1;</code>
		 */
		public boolean hasSubReqID() {
			return ((bitField0_ & 0x00000001) == 0x00000001);
		}

		/**
		 * <code>required int32 subReqID = 1;</code>
		 */
		public int getSubReqID() {
			return subReqID_;
		}

		// required string userName = 2;
		public static final int USERNAME_FIELD_NUMBER = 2;
		private java.lang.Object userName_;

		/**
		 * <code>required string userName = 2;</code>
		 */
		public boolean hasUserName() {
			return ((bitField0_ & 0x00000002) == 0x00000002);
		}

		/**
		 * <code>required string userName = 2;</code>
		 */
		public java.lang.String getUserName() {
			java.lang.Object ref = userName_;
			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();
				if (bs.isValidUtf8()) {
					userName_ = s;
				}
				return s;
			}
		}

		/**
		 * <code>required string userName = 2;</code>
		 */
		public com.google.protobuf.ByteString getUserNameBytes() {
			java.lang.Object ref = userName_;
			if (ref instanceof java.lang.String) {
				com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
				userName_ = b;
				return b;
			} else {
				return (com.google.protobuf.ByteString) ref;
			}
		}

		// required string productName = 3;
		public static final int PRODUCTNAME_FIELD_NUMBER = 3;
		private java.lang.Object productName_;

		/**
		 * <code>required string productName = 3;</code>
		 */
		public boolean hasProductName() {
			return ((bitField0_ & 0x00000004) == 0x00000004);
		}

		/**
		 * <code>required string productName = 3;</code>
		 */
		public java.lang.String getProductName() {
			java.lang.Object ref = productName_;
			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();
				if (bs.isValidUtf8()) {
					productName_ = s;
				}
				return s;
			}
		}

		/**
		 * <code>required string productName = 3;</code>
		 */
		public com.google.protobuf.ByteString getProductNameBytes() {
			java.lang.Object ref = productName_;
			if (ref instanceof java.lang.String) {
				com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
				productName_ = b;
				return b;
			} else {
				return (com.google.protobuf.ByteString) ref;
			}
		}

		// repeated string address = 4;
		public static final int ADDRESS_FIELD_NUMBER = 4;
		private com.google.protobuf.LazyStringList address_;

		/**
		 * <code>repeated string address = 4;</code>
		 */
		public java.util.List<java.lang.String> getAddressList() {
			return address_;
		}

		/**
		 * <code>repeated string address = 4;</code>
		 */
		public int getAddressCount() {
			return address_.size();
		}

		/**
		 * <code>repeated string address = 4;</code>
		 */
		public java.lang.String getAddress(int index) {
			return address_.get(index);
		}

		/**
		 * <code>repeated string address = 4;</code>
		 */
		public com.google.protobuf.ByteString getAddressBytes(int index) {
			return address_.getByteString(index);
		}

		private void initFields() {
			subReqID_ = 0;
			userName_ = "";
			productName_ = "";
			address_ = com.google.protobuf.LazyStringArrayList.EMPTY;
		}

		private byte memoizedIsInitialized = -1;

		public final boolean isInitialized() {
			byte isInitialized = memoizedIsInitialized;
			if (isInitialized != -1)
				return isInitialized == 1;

			if (!hasSubReqID()) {
				memoizedIsInitialized = 0;
				return false;
			}
			if (!hasUserName()) {
				memoizedIsInitialized = 0;
				return false;
			}
			if (!hasProductName()) {
				memoizedIsInitialized = 0;
				return false;
			}
			memoizedIsInitialized = 1;
			return true;
		}

		public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
			getSerializedSize();
			if (((bitField0_ & 0x00000001) == 0x00000001)) {
				output.writeInt32(1, subReqID_);
			}
			if (((bitField0_ & 0x00000002) == 0x00000002)) {
				output.writeBytes(2, getUserNameBytes());
			}
			if (((bitField0_ & 0x00000004) == 0x00000004)) {
				output.writeBytes(3, getProductNameBytes());
			}
			for (int i = 0; i < address_.size(); i++) {
				output.writeBytes(4, address_.getByteString(i));
			}
			getUnknownFields().writeTo(output);
		}

		private int memoizedSerializedSize = -1;

		public int getSerializedSize() {
			int size = memoizedSerializedSize;
			if (size != -1)
				return size;

			size = 0;
			if (((bitField0_ & 0x00000001) == 0x00000001)) {
				size += com.google.protobuf.CodedOutputStream.computeInt32Size(1, subReqID_);
			}
			if (((bitField0_ & 0x00000002) == 0x00000002)) {
				size += com.google.protobuf.CodedOutputStream.computeBytesSize(2, getUserNameBytes());
			}
			if (((bitField0_ & 0x00000004) == 0x00000004)) {
				size += com.google.protobuf.CodedOutputStream.computeBytesSize(3, getProductNameBytes());
			}
			{
				int dataSize = 0;
				for (int i = 0; i < address_.size(); i++) {
					dataSize += com.google.protobuf.CodedOutputStream.computeBytesSizeNoTag(address_.getByteString(i));
				}
				size += dataSize;
				size += 1 * getAddressList().size();
			}
			size += getUnknownFields().getSerializedSize();
			memoizedSerializedSize = size;
			return size;
		}

		private static final long serialVersionUID = 0L;

		@java.lang.Override
		protected java.lang.Object writeReplace() throws java.io.ObjectStreamException {
			return super.writeReplace();
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
			return PARSER.parseFrom(data);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
			return PARSER.parseFrom(data, extensionRegistry);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
			return PARSER.parseFrom(data);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
			return PARSER.parseFrom(data, extensionRegistry);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parseFrom(java.io.InputStream input) throws java.io.IOException {
			return PARSER.parseFrom(input);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
			return PARSER.parseFrom(input, extensionRegistry);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
			return PARSER.parseDelimitedFrom(input);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
			return PARSER.parseDelimitedFrom(input, extensionRegistry);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
			return PARSER.parseFrom(input);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
			return PARSER.parseFrom(input, extensionRegistry);
		}

		public static Builder newBuilder() {
			return Builder.create();
		}

		public Builder newBuilderForType() {
			return newBuilder();
		}

		public static Builder newBuilder(com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq prototype) {
			return newBuilder().mergeFrom(prototype);
		}

		public Builder toBuilder() {
			return newBuilder(this);
		}

		@java.lang.Override
		protected Builder newBuilderForType(com.google.protobuf.GeneratedMessage.BuilderParent parent) {
			Builder builder = new Builder(parent);
			return builder;
		}

		/**
		 * Protobuf type {@code netty.SubscribeReq}
		 */
		public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder<Builder> implements com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReqOrBuilder {
			public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
				return com.shihuan.netty.codec.protobuf.SubscribeReqProto.internal_static_netty_SubscribeReq_descriptor;
			}

			protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() {
				return com.shihuan.netty.codec.protobuf.SubscribeReqProto.internal_static_netty_SubscribeReq_fieldAccessorTable.ensureFieldAccessorsInitialized(com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq.class, com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq.Builder.class);
			}

			// Construct using
			// com.phei.netty.codec.protobuf.SubscribeReqProto.SubscribeReq.newBuilder()
			private Builder() {
				maybeForceBuilderInitialization();
			}

			private Builder(com.google.protobuf.GeneratedMessage.BuilderParent parent) {
				super(parent);
				maybeForceBuilderInitialization();
			}

			private void maybeForceBuilderInitialization() {
				if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
				}
			}

			private static Builder create() {
				return new Builder();
			}

			public Builder clear() {
				super.clear();
				subReqID_ = 0;
				bitField0_ = (bitField0_ & ~0x00000001);
				userName_ = "";
				bitField0_ = (bitField0_ & ~0x00000002);
				productName_ = "";
				bitField0_ = (bitField0_ & ~0x00000004);
				address_ = com.google.protobuf.LazyStringArrayList.EMPTY;
				bitField0_ = (bitField0_ & ~0x00000008);
				return this;
			}

			public Builder clone() {
				return create().mergeFrom(buildPartial());
			}

			public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
				return com.shihuan.netty.codec.protobuf.SubscribeReqProto.internal_static_netty_SubscribeReq_descriptor;
			}

			public com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq getDefaultInstanceForType() {
				return com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq.getDefaultInstance();
			}

			public com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq build() {
				com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq result = buildPartial();
				if (!result.isInitialized()) {
					throw newUninitializedMessageException(result);
				}
				return result;
			}

			public com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq buildPartial() {
				com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq result = new com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq(this);
				int from_bitField0_ = bitField0_;
				int to_bitField0_ = 0;
				if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
					to_bitField0_ |= 0x00000001;
				}
				result.subReqID_ = subReqID_;
				if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
					to_bitField0_ |= 0x00000002;
				}
				result.userName_ = userName_;
				if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
					to_bitField0_ |= 0x00000004;
				}
				result.productName_ = productName_;
				if (((bitField0_ & 0x00000008) == 0x00000008)) {
					address_ = new com.google.protobuf.UnmodifiableLazyStringList(address_);
					bitField0_ = (bitField0_ & ~0x00000008);
				}
				result.address_ = address_;
				result.bitField0_ = to_bitField0_;
				onBuilt();
				return result;
			}

			public Builder mergeFrom(com.google.protobuf.Message other) {
				if (other instanceof com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq) {
					return mergeFrom((com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq) other);
				} else {
					super.mergeFrom(other);
					return this;
				}
			}

			public Builder mergeFrom(com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq other) {
				if (other == com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq.getDefaultInstance())
					return this;
				if (other.hasSubReqID()) {
					setSubReqID(other.getSubReqID());
				}
				if (other.hasUserName()) {
					bitField0_ |= 0x00000002;
					userName_ = other.userName_;
					onChanged();
				}
				if (other.hasProductName()) {
					bitField0_ |= 0x00000004;
					productName_ = other.productName_;
					onChanged();
				}
				if (!other.address_.isEmpty()) {
					if (address_.isEmpty()) {
						address_ = other.address_;
						bitField0_ = (bitField0_ & ~0x00000008);
					} else {
						ensureAddressIsMutable();
						address_.addAll(other.address_);
					}
					onChanged();
				}
				this.mergeUnknownFields(other.getUnknownFields());
				return this;
			}

			public final boolean isInitialized() {
				if (!hasSubReqID()) {

					return false;
				}
				if (!hasUserName()) {

					return false;
				}
				if (!hasProductName()) {

					return false;
				}
				return true;
			}

			public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
				com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq parsedMessage = null;
				try {
					parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
				} catch (com.google.protobuf.InvalidProtocolBufferException e) {
					parsedMessage = (com.shihuan.netty.codec.protobuf.SubscribeReqProto.SubscribeReq) e.getUnfinishedMessage();
					throw e;
				} finally {
					if (parsedMessage != null) {
						mergeFrom(parsedMessage);
					}
				}
				return this;
			}

			private int bitField0_;

			// required int32 subReqID = 1;
			private int subReqID_;

			/**
			 * <code>required int32 subReqID = 1;</code>
			 */
			public boolean hasSubReqID() {
				return ((bitField0_ & 0x00000001) == 0x00000001);
			}

			/**
			 * <code>required int32 subReqID = 1;</code>
			 */
			public int getSubReqID() {
				return subReqID_;
			}

			/**
			 * <code>required int32 subReqID = 1;</code>
			 */
			public Builder setSubReqID(int value) {
				bitField0_ |= 0x00000001;
				subReqID_ = value;
				onChanged();
				return this;
			}

			/**
			 * <code>required int32 subReqID = 1;</code>
			 */
			public Builder clearSubReqID() {
				bitField0_ = (bitField0_ & ~0x00000001);
				subReqID_ = 0;
				onChanged();
				return this;
			}

			// required string userName = 2;
			private java.lang.Object userName_ = "";

			/**
			 * <code>required string userName = 2;</code>
			 */
			public boolean hasUserName() {
				return ((bitField0_ & 0x00000002) == 0x00000002);
			}

			/**
			 * <code>required string userName = 2;</code>
			 */
			public java.lang.String getUserName() {
				java.lang.Object ref = userName_;
				if (!(ref instanceof java.lang.String)) {
					java.lang.String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
					userName_ = s;
					return s;
				} else {
					return (java.lang.String) ref;
				}
			}

			/**
			 * <code>required string userName = 2;</code>
			 */
			public com.google.protobuf.ByteString getUserNameBytes() {
				java.lang.Object ref = userName_;
				if (ref instanceof String) {
					com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
					userName_ = b;
					return b;
				} else {
					return (com.google.protobuf.ByteString) ref;
				}
			}

			/**
			 * <code>required string userName = 2;</code>
			 */
			public Builder setUserName(java.lang.String value) {
				if (value == null) {
					throw new NullPointerException();
				}
				bitField0_ |= 0x00000002;
				userName_ = value;
				onChanged();
				return this;
			}

			/**
			 * <code>required string userName = 2;</code>
			 */
			public Builder clearUserName() {
				bitField0_ = (bitField0_ & ~0x00000002);
				userName_ = getDefaultInstance().getUserName();
				onChanged();
				return this;
			}

			/**
			 * <code>required string userName = 2;</code>
			 */
			public Builder setUserNameBytes(com.google.protobuf.ByteString value) {
				if (value == null) {
					throw new NullPointerException();
				}
				bitField0_ |= 0x00000002;
				userName_ = value;
				onChanged();
				return this;
			}

			// required string productName = 3;
			private java.lang.Object productName_ = "";

			/**
			 * <code>required string productName = 3;</code>
			 */
			public boolean hasProductName() {
				return ((bitField0_ & 0x00000004) == 0x00000004);
			}

			/**
			 * <code>required string productName = 3;</code>
			 */
			public java.lang.String getProductName() {
				java.lang.Object ref = productName_;
				if (!(ref instanceof java.lang.String)) {
					java.lang.String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
					productName_ = s;
					return s;
				} else {
					return (java.lang.String) ref;
				}
			}

			/**
			 * <code>required string productName = 3;</code>
			 */
			public com.google.protobuf.ByteString getProductNameBytes() {
				java.lang.Object ref = productName_;
				if (ref instanceof String) {
					com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
					productName_ = b;
					return b;
				} else {
					return (com.google.protobuf.ByteString) ref;
				}
			}

			/**
			 * <code>required string productName = 3;</code>
			 */
			public Builder setProductName(java.lang.String value) {
				if (value == null) {
					throw new NullPointerException();
				}
				bitField0_ |= 0x00000004;
				productName_ = value;
				onChanged();
				return this;
			}

			/**
			 * <code>required string productName = 3;</code>
			 */
			public Builder clearProductName() {
				bitField0_ = (bitField0_ & ~0x00000004);
				productName_ = getDefaultInstance().getProductName();
				onChanged();
				return this;
			}

			/**
			 * <code>required string productName = 3;</code>
			 */
			public Builder setProductNameBytes(com.google.protobuf.ByteString value) {
				if (value == null) {
					throw new NullPointerException();
				}
				bitField0_ |= 0x00000004;
				productName_ = value;
				onChanged();
				return this;
			}

			// repeated string address = 4;
			private com.google.protobuf.LazyStringList address_ = com.google.protobuf.LazyStringArrayList.EMPTY;

			private void ensureAddressIsMutable() {
				if (!((bitField0_ & 0x00000008) == 0x00000008)) {
					address_ = new com.google.protobuf.LazyStringArrayList(address_);
					bitField0_ |= 0x00000008;
				}
			}

			/**
			 * <code>repeated string address = 4;</code>
			 */
			public java.util.List<java.lang.String> getAddressList() {
				return java.util.Collections.unmodifiableList(address_);
			}

			/**
			 * <code>repeated string address = 4;</code>
			 */
			public int getAddressCount() {
				return address_.size();
			}

			/**
			 * <code>repeated string address = 4;</code>
			 */
			public java.lang.String getAddress(int index) {
				return address_.get(index);
			}

			/**
			 * <code>repeated string address = 4;</code>
			 */
			public com.google.protobuf.ByteString getAddressBytes(int index) {
				return address_.getByteString(index);
			}

			/**
			 * <code>repeated string address = 4;</code>
			 */
			public Builder setAddress(int index, java.lang.String value) {
				if (value == null) {
					throw new NullPointerException();
				}
				ensureAddressIsMutable();
				address_.set(index, value);
				onChanged();
				return this;
			}

			/**
			 * <code>repeated string address = 4;</code>
			 */
			public Builder addAddress(java.lang.String value) {
				if (value == null) {
					throw new NullPointerException();
				}
				ensureAddressIsMutable();
				address_.add(value);
				onChanged();
				return this;
			}

			/**
			 * <code>repeated string address = 4;</code>
			 */
			public Builder addAllAddress(java.lang.Iterable<java.lang.String> values) {
				ensureAddressIsMutable();
				super.addAll(values, address_);
				onChanged();
				return this;
			}

			/**
			 * <code>repeated string address = 4;</code>
			 */
			public Builder clearAddress() {
				address_ = com.google.protobuf.LazyStringArrayList.EMPTY;
				bitField0_ = (bitField0_ & ~0x00000008);
				onChanged();
				return this;
			}

			/**
			 * <code>repeated string address = 4;</code>
			 */
			public Builder addAddressBytes(com.google.protobuf.ByteString value) {
				if (value == null) {
					throw new NullPointerException();
				}
				ensureAddressIsMutable();
				address_.add(value);
				onChanged();
				return this;
			}

			// @@protoc_insertion_point(builder_scope:netty.SubscribeReq)
		}

		static {
			defaultInstance = new SubscribeReq(true);
			defaultInstance.initFields();
		}

		// @@protoc_insertion_point(class_scope:netty.SubscribeReq)
	}

	private static com.google.protobuf.Descriptors.Descriptor internal_static_netty_SubscribeReq_descriptor;
	private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_netty_SubscribeReq_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\030netty/SubscribeReq.proto\022\005netty\"X\n\014Sub"
				+ "scribeReq\022\020\n\010subReqID\030\001 \002(\005\022\020\n\010userName\030"
				+ "\002 \002(\t\022\023\n\013productName\030\003 \002(\t\022\017\n\007address\030\004 "
				+ "\003(\tB2\n\035com.phei.netty.codec.protobufB\021Su"
				+ "bscribeReqProto" };
		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;
				internal_static_netty_SubscribeReq_descriptor = getDescriptor().getMessageTypes().get(0);
				internal_static_netty_SubscribeReq_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable(internal_static_netty_SubscribeReq_descriptor, new java.lang.String[] { "SubReqID", "UserName", "ProductName", "Address", });
				return null;
			}
		};
		com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}, assigner);
	}
	
}


SubscribeRespProto.java文件内容如下:
package com.shihuan.netty.codec.protobuf;

public final class SubscribeRespProto {

	private SubscribeRespProto() {
		
	}

	public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
		
	}

	public interface SubscribeRespOrBuilder extends
			com.google.protobuf.MessageOrBuilder {

		// required int32 subReqID = 1;
		/**
		 * <code>required int32 subReqID = 1;</code>
		 */
		boolean hasSubReqID();

		/**
		 * <code>required int32 subReqID = 1;</code>
		 */
		int getSubReqID();

		// required int32 respCode = 2;
		/**
		 * <code>required int32 respCode = 2;</code>
		 */
		boolean hasRespCode();

		/**
		 * <code>required int32 respCode = 2;</code>
		 */
		int getRespCode();

		// required string desc = 3;
		/**
		 * <code>required string desc = 3;</code>
		 */
		boolean hasDesc();

		/**
		 * <code>required string desc = 3;</code>
		 */
		java.lang.String getDesc();

		/**
		 * <code>required string desc = 3;</code>
		 */
		com.google.protobuf.ByteString getDescBytes();
	}

	/**
	 * Protobuf type {@code netty.SubscribeResp}
	 */
	public static final class SubscribeResp extends
			com.google.protobuf.GeneratedMessage implements
			SubscribeRespOrBuilder {
		// Use SubscribeResp.newBuilder() to construct.
		private SubscribeResp(
				com.google.protobuf.GeneratedMessage.Builder<?> builder) {
			super(builder);
			this.unknownFields = builder.getUnknownFields();
		}

		private SubscribeResp(boolean noInit) {
			this.unknownFields = com.google.protobuf.UnknownFieldSet
					.getDefaultInstance();
		}

		private static final SubscribeResp defaultInstance;

		public static SubscribeResp getDefaultInstance() {
			return defaultInstance;
		}

		public SubscribeResp getDefaultInstanceForType() {
			return defaultInstance;
		}

		private final com.google.protobuf.UnknownFieldSet unknownFields;

		@java.lang.Override
		public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
			return this.unknownFields;
		}

		private SubscribeResp(com.google.protobuf.CodedInputStream input,
				com.google.protobuf.ExtensionRegistryLite extensionRegistry)
				throws com.google.protobuf.InvalidProtocolBufferException {
			initFields();
			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;
					default: {
						if (!parseUnknownField(input, unknownFields,
								extensionRegistry, tag)) {
							done = true;
						}
						break;
					}
					case 8: {
						bitField0_ |= 0x00000001;
						subReqID_ = input.readInt32();
						break;
					}
					case 16: {
						bitField0_ |= 0x00000002;
						respCode_ = input.readInt32();
						break;
					}
					case 26: {
						bitField0_ |= 0x00000004;
						desc_ = input.readBytes();
						break;
					}
					}
				}
			} catch (com.google.protobuf.InvalidProtocolBufferException e) {
				throw e.setUnfinishedMessage(this);
			} catch (java.io.IOException e) {
				throw new com.google.protobuf.InvalidProtocolBufferException(
						e.getMessage()).setUnfinishedMessage(this);
			} finally {
				this.unknownFields = unknownFields.build();
				makeExtensionsImmutable();
			}
		}

		public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
			return com.shihuan.netty.codec.protobuf.SubscribeRespProto.internal_static_netty_SubscribeResp_descriptor;
		}

		protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() {
			return com.shihuan.netty.codec.protobuf.SubscribeRespProto.internal_static_netty_SubscribeResp_fieldAccessorTable
					.ensureFieldAccessorsInitialized(
							com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp.class,
							com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp.Builder.class);
		}

		public static com.google.protobuf.Parser<SubscribeResp> PARSER = new com.google.protobuf.AbstractParser<SubscribeResp>() {
			public SubscribeResp parsePartialFrom(
					com.google.protobuf.CodedInputStream input,
					com.google.protobuf.ExtensionRegistryLite extensionRegistry)
					throws com.google.protobuf.InvalidProtocolBufferException {
				return new SubscribeResp(input, extensionRegistry);
			}
		};

		@java.lang.Override
		public com.google.protobuf.Parser<SubscribeResp> getParserForType() {
			return PARSER;
		}

		private int bitField0_;
		// required int32 subReqID = 1;
		public static final int SUBREQID_FIELD_NUMBER = 1;
		private int subReqID_;

		/**
		 * <code>required int32 subReqID = 1;</code>
		 */
		public boolean hasSubReqID() {
			return ((bitField0_ & 0x00000001) == 0x00000001);
		}

		/**
		 * <code>required int32 subReqID = 1;</code>
		 */
		public int getSubReqID() {
			return subReqID_;
		}

		// required int32 respCode = 2;
		public static final int RESPCODE_FIELD_NUMBER = 2;
		private int respCode_;

		/**
		 * <code>required int32 respCode = 2;</code>
		 */
		public boolean hasRespCode() {
			return ((bitField0_ & 0x00000002) == 0x00000002);
		}

		/**
		 * <code>required int32 respCode = 2;</code>
		 */
		public int getRespCode() {
			return respCode_;
		}

		// required string desc = 3;
		public static final int DESC_FIELD_NUMBER = 3;
		private java.lang.Object desc_;

		/**
		 * <code>required string desc = 3;</code>
		 */
		public boolean hasDesc() {
			return ((bitField0_ & 0x00000004) == 0x00000004);
		}

		/**
		 * <code>required string desc = 3;</code>
		 */
		public java.lang.String getDesc() {
			java.lang.Object ref = desc_;
			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();
				if (bs.isValidUtf8()) {
					desc_ = s;
				}
				return s;
			}
		}

		/**
		 * <code>required string desc = 3;</code>
		 */
		public com.google.protobuf.ByteString getDescBytes() {
			java.lang.Object ref = desc_;
			if (ref instanceof java.lang.String) {
				com.google.protobuf.ByteString b = com.google.protobuf.ByteString
						.copyFromUtf8((java.lang.String) ref);
				desc_ = b;
				return b;
			} else {
				return (com.google.protobuf.ByteString) ref;
			}
		}

		private void initFields() {
			subReqID_ = 0;
			respCode_ = 0;
			desc_ = "";
		}

		private byte memoizedIsInitialized = -1;

		public final boolean isInitialized() {
			byte isInitialized = memoizedIsInitialized;
			if (isInitialized != -1)
				return isInitialized == 1;

			if (!hasSubReqID()) {
				memoizedIsInitialized = 0;
				return false;
			}
			if (!hasRespCode()) {
				memoizedIsInitialized = 0;
				return false;
			}
			if (!hasDesc()) {
				memoizedIsInitialized = 0;
				return false;
			}
			memoizedIsInitialized = 1;
			return true;
		}

		public void writeTo(com.google.protobuf.CodedOutputStream output)
				throws java.io.IOException {
			getSerializedSize();
			if (((bitField0_ & 0x00000001) == 0x00000001)) {
				output.writeInt32(1, subReqID_);
			}
			if (((bitField0_ & 0x00000002) == 0x00000002)) {
				output.writeInt32(2, respCode_);
			}
			if (((bitField0_ & 0x00000004) == 0x00000004)) {
				output.writeBytes(3, getDescBytes());
			}
			getUnknownFields().writeTo(output);
		}

		private int memoizedSerializedSize = -1;

		public int getSerializedSize() {
			int size = memoizedSerializedSize;
			if (size != -1)
				return size;

			size = 0;
			if (((bitField0_ & 0x00000001) == 0x00000001)) {
				size += com.google.protobuf.CodedOutputStream.computeInt32Size(
						1, subReqID_);
			}
			if (((bitField0_ & 0x00000002) == 0x00000002)) {
				size += com.google.protobuf.CodedOutputStream.computeInt32Size(
						2, respCode_);
			}
			if (((bitField0_ & 0x00000004) == 0x00000004)) {
				size += com.google.protobuf.CodedOutputStream.computeBytesSize(
						3, getDescBytes());
			}
			size += getUnknownFields().getSerializedSize();
			memoizedSerializedSize = size;
			return size;
		}

		private static final long serialVersionUID = 0L;

		@java.lang.Override
		protected java.lang.Object writeReplace()
				throws java.io.ObjectStreamException {
			return super.writeReplace();
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parseFrom(
				com.google.protobuf.ByteString data)
				throws com.google.protobuf.InvalidProtocolBufferException {
			return PARSER.parseFrom(data);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parseFrom(
				com.google.protobuf.ByteString data,
				com.google.protobuf.ExtensionRegistryLite extensionRegistry)
				throws com.google.protobuf.InvalidProtocolBufferException {
			return PARSER.parseFrom(data, extensionRegistry);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parseFrom(
				byte[] data)
				throws com.google.protobuf.InvalidProtocolBufferException {
			return PARSER.parseFrom(data);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parseFrom(
				byte[] data,
				com.google.protobuf.ExtensionRegistryLite extensionRegistry)
				throws com.google.protobuf.InvalidProtocolBufferException {
			return PARSER.parseFrom(data, extensionRegistry);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parseFrom(
				java.io.InputStream input) throws java.io.IOException {
			return PARSER.parseFrom(input);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parseFrom(
				java.io.InputStream input,
				com.google.protobuf.ExtensionRegistryLite extensionRegistry)
				throws java.io.IOException {
			return PARSER.parseFrom(input, extensionRegistry);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parseDelimitedFrom(
				java.io.InputStream input) throws java.io.IOException {
			return PARSER.parseDelimitedFrom(input);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parseDelimitedFrom(
				java.io.InputStream input,
				com.google.protobuf.ExtensionRegistryLite extensionRegistry)
				throws java.io.IOException {
			return PARSER.parseDelimitedFrom(input, extensionRegistry);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parseFrom(
				com.google.protobuf.CodedInputStream input)
				throws java.io.IOException {
			return PARSER.parseFrom(input);
		}

		public static com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parseFrom(
				com.google.protobuf.CodedInputStream input,
				com.google.protobuf.ExtensionRegistryLite extensionRegistry)
				throws java.io.IOException {
			return PARSER.parseFrom(input, extensionRegistry);
		}

		public static Builder newBuilder() {
			return Builder.create();
		}

		public Builder newBuilderForType() {
			return newBuilder();
		}

		public static Builder newBuilder(
				com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp prototype) {
			return newBuilder().mergeFrom(prototype);
		}

		public Builder toBuilder() {
			return newBuilder(this);
		}

		@java.lang.Override
		protected Builder newBuilderForType(
				com.google.protobuf.GeneratedMessage.BuilderParent parent) {
			Builder builder = new Builder(parent);
			return builder;
		}

		/**
		 * Protobuf type {@code netty.SubscribeResp}
		 */
		public static final class Builder extends
				com.google.protobuf.GeneratedMessage.Builder<Builder>
				implements
				com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeRespOrBuilder {
			public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
				return com.shihuan.netty.codec.protobuf.SubscribeRespProto.internal_static_netty_SubscribeResp_descriptor;
			}

			protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() {
				return com.shihuan.netty.codec.protobuf.SubscribeRespProto.internal_static_netty_SubscribeResp_fieldAccessorTable
						.ensureFieldAccessorsInitialized(
								com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp.class,
								com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp.Builder.class);
			}

			// Construct using
			// com.phei.netty.codec.protobuf.SubscribeRespProto.SubscribeResp.newBuilder()
			private Builder() {
				maybeForceBuilderInitialization();
			}

			private Builder(
					com.google.protobuf.GeneratedMessage.BuilderParent parent) {
				super(parent);
				maybeForceBuilderInitialization();
			}

			private void maybeForceBuilderInitialization() {
				if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
				}
			}

			private static Builder create() {
				return new Builder();
			}

			public Builder clear() {
				super.clear();
				subReqID_ = 0;
				bitField0_ = (bitField0_ & ~0x00000001);
				respCode_ = 0;
				bitField0_ = (bitField0_ & ~0x00000002);
				desc_ = "";
				bitField0_ = (bitField0_ & ~0x00000004);
				return this;
			}

			public Builder clone() {
				return create().mergeFrom(buildPartial());
			}

			public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
				return com.shihuan.netty.codec.protobuf.SubscribeRespProto.internal_static_netty_SubscribeResp_descriptor;
			}

			public com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp getDefaultInstanceForType() {
				return com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp
						.getDefaultInstance();
			}

			public com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp build() {
				com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp result = buildPartial();
				if (!result.isInitialized()) {
					throw newUninitializedMessageException(result);
				}
				return result;
			}

			public com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp buildPartial() {
				com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp result = new com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp(
						this);
				int from_bitField0_ = bitField0_;
				int to_bitField0_ = 0;
				if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
					to_bitField0_ |= 0x00000001;
				}
				result.subReqID_ = subReqID_;
				if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
					to_bitField0_ |= 0x00000002;
				}
				result.respCode_ = respCode_;
				if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
					to_bitField0_ |= 0x00000004;
				}
				result.desc_ = desc_;
				result.bitField0_ = to_bitField0_;
				onBuilt();
				return result;
			}

			public Builder mergeFrom(com.google.protobuf.Message other) {
				if (other instanceof com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp) {
					return mergeFrom((com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp) other);
				} else {
					super.mergeFrom(other);
					return this;
				}
			}

			public Builder mergeFrom(
					com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp other) {
				if (other == com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp
						.getDefaultInstance())
					return this;
				if (other.hasSubReqID()) {
					setSubReqID(other.getSubReqID());
				}
				if (other.hasRespCode()) {
					setRespCode(other.getRespCode());
				}
				if (other.hasDesc()) {
					bitField0_ |= 0x00000004;
					desc_ = other.desc_;
					onChanged();
				}
				this.mergeUnknownFields(other.getUnknownFields());
				return this;
			}

			public final boolean isInitialized() {
				if (!hasSubReqID()) {

					return false;
				}
				if (!hasRespCode()) {

					return false;
				}
				if (!hasDesc()) {

					return false;
				}
				return true;
			}

			public Builder mergeFrom(
					com.google.protobuf.CodedInputStream input,
					com.google.protobuf.ExtensionRegistryLite extensionRegistry)
					throws java.io.IOException {
				com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp parsedMessage = null;
				try {
					parsedMessage = PARSER.parsePartialFrom(input,
							extensionRegistry);
				} catch (com.google.protobuf.InvalidProtocolBufferException e) {
					parsedMessage = (com.shihuan.netty.codec.protobuf.SubscribeRespProto.SubscribeResp) e.getUnfinishedMessage();
					throw e;
				} finally {
					if (parsedMessage != null) {
						mergeFrom(parsedMessage);
					}
				}
				return this;
			}

			private int bitField0_;

			// required int32 subReqID = 1;
			private int subReqID_;

			/**
			 * <code>required int32 subReqID = 1;</code>
			 */
			public boolean hasSubReqID() {
				return ((bitField0_ & 0x00000001) == 0x00000001);
			}

			/**
			 * <code>required int32 subReqID = 1;</code>
			 */
			public int getSubReqID() {
				return subReqID_;
			}

			/**
			 * <code>required int32 subReqID = 1;</code>
			 */
			public Builder setSubReqID(int value) {
				bitField0_ |= 0x00000001;
				subReqID_ = value;
				onChanged();
				return this;
			}

			/**
			 * <code>required int32 subReqID = 1;</code>
			 */
			public Builder clearSubReqID() {
				bitField0_ = (bitField0_ & ~0x00000001);
				subReqID_ = 0;
				onChanged();
				return this;
			}

			// required int32 respCode = 2;
			private int respCode_;

			/**
			 * <code>required int32 respCode = 2;</code>
			 */
			public boolean hasRespCode() {
				return ((bitField0_ & 0x00000002) == 0x00000002);
			}

			/**
			 * <code>required int32 respCode = 2;</code>
			 */
			public int getRespCode() {
				return respCode_;
			}

			/**
			 * <code>required int32 respCode = 2;</code>
			 */
			public Builder setRespCode(int value) {
				bitField0_ |= 0x00000002;
				respCode_ = value;
				onChanged();
				return this;
			}

			/**
			 * <code>required int32 respCode = 2;</code>
			 */
			public Builder clearRespCode() {
				bitField0_ = (bitField0_ & ~0x00000002);
				respCode_ = 0;
				onChanged();
				return this;
			}

			// required string desc = 3;
			private java.lang.Object desc_ = "";

			/**
			 * <code>required string desc = 3;</code>
			 */
			public boolean hasDesc() {
				return ((bitField0_ & 0x00000004) == 0x00000004);
			}

			/**
			 * <code>required string desc = 3;</code>
			 */
			public java.lang.String getDesc() {
				java.lang.Object ref = desc_;
				if (!(ref instanceof java.lang.String)) {
					java.lang.String s = ((com.google.protobuf.ByteString) ref)
							.toStringUtf8();
					desc_ = s;
					return s;
				} else {
					return (java.lang.String) ref;
				}
			}

			/**
			 * <code>required string desc = 3;</code>
			 */
			public com.google.protobuf.ByteString getDescBytes() {
				java.lang.Object ref = desc_;
				if (ref instanceof String) {
					com.google.protobuf.ByteString b = com.google.protobuf.ByteString
							.copyFromUtf8((java.lang.String) ref);
					desc_ = b;
					return b;
				} else {
					return (com.google.protobuf.ByteString) ref;
				}
			}

			/**
			 * <code>required string desc = 3;</code>
			 */
			public Builder setDesc(java.lang.String value) {
				if (value == null) {
					throw new NullPointerException();
				}
				bitField0_ |= 0x00000004;
				desc_ = value;
				onChanged();
				return this;
			}

			/**
			 * <code>required string desc = 3;</code>
			 */
			public Builder clearDesc() {
				bitField0_ = (bitField0_ & ~0x00000004);
				desc_ = getDefaultInstance().getDesc();
				onChanged();
				return this;
			}

			/**
			 * <code>required string desc = 3;</code>
			 */
			public Builder setDescBytes(com.google.protobuf.ByteString value) {
				if (value == null) {
					throw new NullPointerException();
				}
				bitField0_ |= 0x00000004;
				desc_ = value;
				onChanged();
				return this;
			}

			// @@protoc_insertion_point(builder_scope:netty.SubscribeResp)
		}

		static {
			defaultInstance = new SubscribeResp(true);
			defaultInstance.initFields();
		}

		// @@protoc_insertion_point(class_scope:netty.SubscribeResp)
	}

	private static com.google.protobuf.Descriptors.Descriptor internal_static_netty_SubscribeResp_descriptor;
	private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_netty_SubscribeResp_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\031netty/SubscribeResp.proto\022\005netty\"A\n\rSu"
				+ "bscribeResp\022\020\n\010subReqID\030\001 \002(\005\022\020\n\010respCod"
				+ "e\030\002 \002(\005\022\014\n\004desc\030\003 \002(\tB3\n\035com.phei.netty."
				+ "codec.protobufB\022SubscribeRespProto" };
		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;
				internal_static_netty_SubscribeResp_descriptor = getDescriptor()
						.getMessageTypes().get(0);
				internal_static_netty_SubscribeResp_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
						internal_static_netty_SubscribeResp_descriptor,
						new java.lang.String[] { "SubReqID", "RespCode",
								"Desc", });
				return null;
			}
		};
		com.google.protobuf.Descriptors.FileDescriptor
				.internalBuildGeneratedFileFrom(
						descriptorData,
						new com.google.protobuf.Descriptors.FileDescriptor[] {},
						assigner);
	}
	
}


SubReqServerHandler.java文件内容如下:
package com.shihuan.netty.codec.protobuf.server;

import com.shihuan.netty.codec.protobuf.SubscribeReqProto;
import com.shihuan.netty.codec.protobuf.SubscribeRespProto;

import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

@Sharable
public class SubReqServerHandler extends ChannelHandlerAdapter {

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		SubscribeReqProto.SubscribeReq req = (SubscribeReqProto.SubscribeReq) msg;
		if ("Lilinfeng".equalsIgnoreCase(req.getUserName())) {
			System.out.println("Service accept client subscribe req : [" + req.toString() + "]");
			ctx.writeAndFlush(resp(req.getSubReqID()));
		}
	}

	private SubscribeRespProto.SubscribeResp resp(int subReqID) {
		SubscribeRespProto.SubscribeResp.Builder builder = SubscribeRespProto.SubscribeResp.newBuilder();
		builder.setSubReqID(subReqID);
		builder.setRespCode(0);
		builder.setDesc("Netty book order succeed, 3 days later, sent to the designated address");
		return builder.build();
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
		cause.printStackTrace();
		ctx.close();// 发生异常,关闭链路
	}
	
}


SubReqServer.java文件内容如下:
package com.shihuan.netty.codec.protobuf.server;

import com.shihuan.netty.codec.protobuf.SubscribeReqProto;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
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;
import io.netty.handler.codec.protobuf.ProtobufEncoder;
import io.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
import io.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

public class SubReqServer {

	public void bind(int port) throws Exception {
		// 配置服务端的NIO线程组
		EventLoopGroup bossGroup = new NioEventLoopGroup();
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		try {
			ServerBootstrap b = new ServerBootstrap();
			b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 100).handler(new LoggingHandler(LogLevel.INFO)).childHandler(new ChannelInitializer<SocketChannel>() {
				@Override
				public void initChannel(SocketChannel ch) {
					ch.pipeline().addLast(new ProtobufVarint32FrameDecoder());   //处理半包粘包的消息
					ch.pipeline().addLast(new ProtobufDecoder(SubscribeReqProto.SubscribeReq.getDefaultInstance()));
					ch.pipeline().addLast(new ProtobufVarint32LengthFieldPrepender());
					ch.pipeline().addLast(new ProtobufEncoder());
					ch.pipeline().addLast(new SubReqServerHandler());
				}
			});

			// 绑定端口,同步等待成功
			ChannelFuture f = b.bind(port).sync();

			// 等待服务端监听端口关闭
			f.channel().closeFuture().sync();
		} finally {
			// 优雅退出,释放线程池资源
			bossGroup.shutdownGracefully();
			workerGroup.shutdownGracefully();
		}
	}
	
	public static void main(String[] args) throws Exception {
		int port = 8080;
		if (args != null && args.length > 0) {
			try {
				port = Integer.valueOf(args[0]);
			} catch (NumberFormatException e) {
				// 采用默认值
			}
		}
		new SubReqServer().bind(port);
	}

}


SubReqClientHandler.java文件内容如下:
package com.shihuan.netty.codec.protobuf.client;

import java.util.ArrayList;
import java.util.List;

import com.shihuan.netty.codec.protobuf.SubscribeReqProto;

import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

public class SubReqClientHandler extends ChannelHandlerAdapter {

	/**
	 * Creates a client-side handler.
	 */
	public SubReqClientHandler() {
		
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) {
		for (int i = 0; i < 10; i++) {
			ctx.write(subReq(i));
		}
		ctx.flush();
	}

	private SubscribeReqProto.SubscribeReq subReq(int i) {
		SubscribeReqProto.SubscribeReq.Builder builder = SubscribeReqProto.SubscribeReq.newBuilder();
		builder.setSubReqID(i);
		builder.setUserName("Lilinfeng");
		builder.setProductName("Netty Book For Protobuf");
		List<String> address = new ArrayList<>();
		address.add("NanJing YuHuaTai");
		address.add("BeiJing LiuLiChang");
		address.add("ShenZhen HongShuLin");
		builder.addAllAddress(address);
		return builder.build();
	}

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		System.out.println("Receive server response : [" + msg + "]");
	}

	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		ctx.flush();
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
		cause.printStackTrace();
		ctx.close();
	}
	
}


SubReqClient.java文件内容如下:
package com.shihuan.netty.codec.protobuf.client;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
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.ProtobufDecoder;
import io.netty.handler.codec.protobuf.ProtobufEncoder;
import io.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
import io.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender;

import com.shihuan.netty.codec.protobuf.SubscribeRespProto;

public class SubReqClient {

	public void connect(int port, String host) throws Exception {
		// 配置客户端NIO线程组
		EventLoopGroup group = new NioEventLoopGroup();
		try {
			Bootstrap b = new Bootstrap();
			b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true).handler(new ChannelInitializer<SocketChannel>() {
				@Override
				public void initChannel(SocketChannel ch) throws Exception {
					ch.pipeline().addLast(new ProtobufVarint32FrameDecoder());
					ch.pipeline().addLast(new ProtobufDecoder(SubscribeRespProto.SubscribeResp.getDefaultInstance()));
					ch.pipeline().addLast(new ProtobufVarint32LengthFieldPrepender());
					ch.pipeline().addLast(new ProtobufEncoder());
					ch.pipeline().addLast(new SubReqClientHandler());
				}
			});

			// 发起异步连接操作
			ChannelFuture f = b.connect(host, port).sync();

			// 当代客户端链路关闭
			f.channel().closeFuture().sync();
		} finally {
			// 优雅退出,释放NIO线程组
			group.shutdownGracefully();
		}
	}
	
	public static void main(String[] args) throws Exception {
		int port = 8080;
		if (args != null && args.length > 0) {
			try {
				port = Integer.valueOf(args[0]);
			} catch (NumberFormatException e) {
				// 采用默认值
			}
		}
		new SubReqClient().connect(port, "127.0.0.1");
	}

}


TestSubscribeReqProto.java文件内容如下:
package com.shihuan.netty.codec.protobuf.test;

import java.util.ArrayList;
import java.util.List;

import com.google.protobuf.InvalidProtocolBufferException;
import com.shihuan.netty.codec.protobuf.SubscribeReqProto;

public class TestSubscribeReqProto {

	private static byte[] encode(SubscribeReqProto.SubscribeReq req) {
		return req.toByteArray();
	}

	private static SubscribeReqProto.SubscribeReq decode(byte[] body) throws InvalidProtocolBufferException {
		return SubscribeReqProto.SubscribeReq.parseFrom(body);
	}

	private static SubscribeReqProto.SubscribeReq createSubscribeReq() {
		SubscribeReqProto.SubscribeReq.Builder builder = SubscribeReqProto.SubscribeReq.newBuilder();
		builder.setSubReqID(1);
		builder.setUserName("Lilinfeng");
		builder.setProductName("Netty Book");
		List<String> address = new ArrayList<>();
		address.add("NanJing YuHuaTai");
		address.add("BeiJing LiuLiChang");
		address.add("ShenZhen HongShuLin");
		builder.addAllAddress(address);
		return builder.build();
	}
	
	public static void main(String[] args) throws InvalidProtocolBufferException {
		SubscribeReqProto.SubscribeReq req = createSubscribeReq();
		System.out.println("Before encode : " + req.toString());
		SubscribeReqProto.SubscribeReq req2 = decode(encode(req));
		System.out.println("After decode : " + req.toString());
		System.out.println("Assert equal : --> " + req2.equals(req));
	}

}


【注】: 附件里protobuf.rar是可运行工程源代码。
  • Netty中Protobuf编解码应用
            
    
    博客分类: NettyProtobuf NettyProtobuf
  • 大小: 32.7 KB
相关标签: Netty Protobuf

上一篇: Mybatis-Plus抽取查询条件

下一篇: