上篇文章,我们学习了“.net/c# Google Protocol Buffers 快速入门”的课程。。。
这篇文章,我们学习如何在.net/c#使用他。
1:首先,安装引用包:
- Install-Package Google.ProtocolBuffers
复制代码 2:.proto文件转成.cs文件,转换方法,上篇文章已经说了,我就不重复说了,下面转换完成的.cs文件:
- // Generated by ProtoGen, Version=2.4.1.555, Culture=neutral, PublicKeyToken=55f7125234beb589. DO NOT EDIT!
- #pragma warning disable 1591, 0612, 3021
- #region Designer generated code
- using pb = global::Google.ProtocolBuffers;
- using pbc = global::Google.ProtocolBuffers.Collections;
- using pbd = global::Google.ProtocolBuffers.Descrip{过滤}tors;
- using scg = global::System.Collections.Generic;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- public static partial class ProtoMyRequest {
- #region Extension registration
- public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
- }
- #endregion
- #region Static variables
- internal static pbd::MessageDescrip{过滤}tor internal__static_MyRequest__Descrip{过滤}tor;
- internal static pb::FieldAccess.FieldAccessorTable<global::MyRequest, global::MyRequest.Builder> internal__static_MyRequest__FieldAccessorTable;
- #endregion
- #region Descrip{过滤}tor
- public static pbd::FileDescrip{过滤}tor Descrip{过滤}tor {
- get { return descrip{过滤}tor; }
- }
- private static pbd::FileDescrip{过滤}tor descrip{过滤}tor;
-
- static ProtoMyRequest() {
- byte[] descrip{过滤}torData = global::System.Convert.FromBase64String(
- string.Concat(
- "ChRQcm90b015UmVxdWVzdC5wcm90byJhCglNeVJlcXVlc3QSDwoHdmVyc2lv",
- "bhgBIAIoBRIMCgRuYW1lGAIgAigJEicKB3dlYnNpdGUYAyABKAk6Fmh0dHA6",
- "Ly93d3cuaXRzdnNlLmNvbS8SDAoEZGF0YRgEIAEoDA=="));
- pbd::FileDescrip{过滤}tor.InternalDescrip{过滤}torAssigner assigner = delegate(pbd::FileDescrip{过滤}tor root) {
- descrip{过滤}tor = root;
- internal__static_MyRequest__Descrip{过滤}tor = Descrip{过滤}tor.MessageTypes[0];
- internal__static_MyRequest__FieldAccessorTable =
- new pb::FieldAccess.FieldAccessorTable<global::MyRequest, global::MyRequest.Builder>(internal__static_MyRequest__Descrip{过滤}tor,
- new string[] { "Version", "Name", "Website", "Data", });
- return null;
- };
- pbd::FileDescrip{过滤}tor.InternalBuildGeneratedFileFrom(descrip{过滤}torData,
- new pbd::FileDescrip{过滤}tor[] {
- }, assigner);
- }
- #endregion
-
- }
- #region Messages
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- public sealed partial class MyRequest : pb::GeneratedMessage<MyRequest, MyRequest.Builder> {
- private MyRequest() { }
- private static readonly MyRequest defaultInstance = new MyRequest().MakeReadOnly();
- private static readonly string[] _myRequestFieldNames = new string[] { "data", "name", "version", "website" };
- private static readonly uint[] _myRequestFieldTags = new uint[] { 34, 18, 8, 26 };
- public static MyRequest DefaultInstance {
- get { return defaultInstance; }
- }
-
- public override MyRequest DefaultInstanceForType {
- get { return DefaultInstance; }
- }
-
- protected override MyRequest ThisMessage {
- get { return this; }
- }
-
- public static pbd::MessageDescrip{过滤}tor Descrip{过滤}tor {
- get { return global::ProtoMyRequest.internal__static_MyRequest__Descrip{过滤}tor; }
- }
-
- protected override pb::FieldAccess.FieldAccessorTable<MyRequest, MyRequest.Builder> InternalFieldAccessors {
- get { return global::ProtoMyRequest.internal__static_MyRequest__FieldAccessorTable; }
- }
-
- public const int VersionFieldNumber = 1;
- private bool hasVersion;
- private int version_;
- public bool HasVersion {
- get { return hasVersion; }
- }
- public int Version {
- get { return version_; }
- }
-
- public const int NameFieldNumber = 2;
- private bool hasName;
- private string name_ = "";
- public bool HasName {
- get { return hasName; }
- }
- public string Name {
- get { return name_; }
- }
-
- public const int WebsiteFieldNumber = 3;
- private bool hasWebsite;
- private string website_ = "http://www.itsvse.com/";
- public bool HasWebsite {
- get { return hasWebsite; }
- }
- public string Website {
- get { return website_; }
- }
-
- public const int DataFieldNumber = 4;
- private bool hasData;
- private pb::ByteString data_ = pb::ByteString.Empty;
- public bool HasData {
- get { return hasData; }
- }
- public pb::ByteString Data {
- get { return data_; }
- }
-
- public override bool IsInitialized {
- get {
- if (!hasVersion) return false;
- if (!hasName) return false;
- return true;
- }
- }
-
- public override void WriteTo(pb::ICodedOutputStream output) {
- CalcSerializedSize();
- string[] field_names = _myRequestFieldNames;
- if (hasVersion) {
- output.WriteInt32(1, field_names[2], Version);
- }
- if (hasName) {
- output.WriteString(2, field_names[1], Name);
- }
- if (hasWebsite) {
- output.WriteString(3, field_names[3], Website);
- }
- if (hasData) {
- output.WriteBytes(4, field_names[0], Data);
- }
- UnknownFields.WriteTo(output);
- }
-
- private int memoizedSerializedSize = -1;
- public override int SerializedSize {
- get {
- int size = memoizedSerializedSize;
- if (size != -1) return size;
- return CalcSerializedSize();
- }
- }
-
- private int CalcSerializedSize() {
- int size = memoizedSerializedSize;
- if (size != -1) return size;
-
- size = 0;
- if (hasVersion) {
- size += pb::CodedOutputStream.ComputeInt32Size(1, Version);
- }
- if (hasName) {
- size += pb::CodedOutputStream.ComputeStringSize(2, Name);
- }
- if (hasWebsite) {
- size += pb::CodedOutputStream.ComputeStringSize(3, Website);
- }
- if (hasData) {
- size += pb::CodedOutputStream.ComputeBytesSize(4, Data);
- }
- size += UnknownFields.SerializedSize;
- memoizedSerializedSize = size;
- return size;
- }
- public static MyRequest ParseFrom(pb::ByteString data) {
- return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
- }
- public static MyRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
- return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
- }
- public static MyRequest ParseFrom(byte[] data) {
- return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
- }
- public static MyRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
- return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
- }
- public static MyRequest ParseFrom(global::System.IO.Stream input) {
- return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
- }
- public static MyRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
- return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
- }
- public static MyRequest ParseDelimitedFrom(global::System.IO.Stream input) {
- return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
- }
- public static MyRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
- return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
- }
- public static MyRequest ParseFrom(pb::ICodedInputStream input) {
- return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
- }
- public static MyRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
- }
- private MyRequest MakeReadOnly() {
- return this;
- }
-
- public static Builder CreateBuilder() { return new Builder(); }
- public override Builder ToBuilder() { return CreateBuilder(this); }
- public override Builder CreateBuilderForType() { return new Builder(); }
- public static Builder CreateBuilder(MyRequest prototype) {
- return new Builder(prototype);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- public sealed partial class Builder : pb::GeneratedBuilder<MyRequest, Builder> {
- protected override Builder ThisBuilder {
- get { return this; }
- }
- public Builder() {
- result = DefaultInstance;
- resultIsReadOnly = true;
- }
- internal Builder(MyRequest cloneFrom) {
- result = cloneFrom;
- resultIsReadOnly = true;
- }
-
- private bool resultIsReadOnly;
- private MyRequest result;
-
- private MyRequest PrepareBuilder() {
- if (resultIsReadOnly) {
- MyRequest original = result;
- result = new MyRequest();
- resultIsReadOnly = false;
- MergeFrom(original);
- }
- return result;
- }
-
- public override bool IsInitialized {
- get { return result.IsInitialized; }
- }
-
- protected override MyRequest MessageBeingBuilt {
- get { return PrepareBuilder(); }
- }
-
- public override Builder Clear() {
- result = DefaultInstance;
- resultIsReadOnly = true;
- return this;
- }
-
- public override Builder Clone() {
- if (resultIsReadOnly) {
- return new Builder(result);
- } else {
- return new Builder().MergeFrom(result);
- }
- }
-
- public override pbd::MessageDescrip{过滤}tor Descrip{过滤}torForType {
- get { return global::MyRequest.Descrip{过滤}tor; }
- }
-
- public override MyRequest DefaultInstanceForType {
- get { return global::MyRequest.DefaultInstance; }
- }
-
- public override MyRequest BuildPartial() {
- if (resultIsReadOnly) {
- return result;
- }
- resultIsReadOnly = true;
- return result.MakeReadOnly();
- }
-
- public override Builder MergeFrom(pb::IMessage other) {
- if (other is MyRequest) {
- return MergeFrom((MyRequest) other);
- } else {
- base.MergeFrom(other);
- return this;
- }
- }
-
- public override Builder MergeFrom(MyRequest other) {
- if (other == global::MyRequest.DefaultInstance) return this;
- PrepareBuilder();
- if (other.HasVersion) {
- Version = other.Version;
- }
- if (other.HasName) {
- Name = other.Name;
- }
- if (other.HasWebsite) {
- Website = other.Website;
- }
- if (other.HasData) {
- Data = other.Data;
- }
- this.MergeUnknownFields(other.UnknownFields);
- return this;
- }
-
- public override Builder MergeFrom(pb::ICodedInputStream input) {
- return MergeFrom(input, pb::ExtensionRegistry.Empty);
- }
-
- public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- PrepareBuilder();
- pb::UnknownFieldSet.Builder unknownFields = null;
- uint tag;
- string field_name;
- while (input.ReadTag(out tag, out field_name)) {
- if(tag == 0 && field_name != null) {
- int field_ordinal = global::System.Array.BinarySearch(_myRequestFieldNames, field_name, global::System.StringComparer.Ordinal);
- if(field_ordinal >= 0)
- tag = _myRequestFieldTags[field_ordinal];
- else {
- if (unknownFields == null) {
- unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
- }
- ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
- continue;
- }
- }
- switch (tag) {
- case 0: {
- throw pb::InvalidProtocolBufferException.InvalidTag();
- }
- default: {
- if (pb::WireFormat.IsEndGroupTag(tag)) {
- if (unknownFields != null) {
- this.UnknownFields = unknownFields.Build();
- }
- return this;
- }
- if (unknownFields == null) {
- unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
- }
- ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
- break;
- }
- case 8: {
- result.hasVersion = input.ReadInt32(ref result.version_);
- break;
- }
- case 18: {
- result.hasName = input.ReadString(ref result.name_);
- break;
- }
- case 26: {
- result.hasWebsite = input.ReadString(ref result.website_);
- break;
- }
- case 34: {
- result.hasData = input.ReadBytes(ref result.data_);
- break;
- }
- }
- }
-
- if (unknownFields != null) {
- this.UnknownFields = unknownFields.Build();
- }
- return this;
- }
-
-
- public bool HasVersion {
- get { return result.hasVersion; }
- }
- public int Version {
- get { return result.Version; }
- set { SetVersion(value); }
- }
- public Builder SetVersion(int value) {
- PrepareBuilder();
- result.hasVersion = true;
- result.version_ = value;
- return this;
- }
- public Builder ClearVersion() {
- PrepareBuilder();
- result.hasVersion = false;
- result.version_ = 0;
- return this;
- }
-
- public bool HasName {
- get { return result.hasName; }
- }
- public string Name {
- get { return result.Name; }
- set { SetName(value); }
- }
- public Builder SetName(string value) {
- pb::ThrowHelper.ThrowIfNull(value, "value");
- PrepareBuilder();
- result.hasName = true;
- result.name_ = value;
- return this;
- }
- public Builder ClearName() {
- PrepareBuilder();
- result.hasName = false;
- result.name_ = "";
- return this;
- }
-
- public bool HasWebsite {
- get { return result.hasWebsite; }
- }
- public string Website {
- get { return result.Website; }
- set { SetWebsite(value); }
- }
- public Builder SetWebsite(string value) {
- pb::ThrowHelper.ThrowIfNull(value, "value");
- PrepareBuilder();
- result.hasWebsite = true;
- result.website_ = value;
- return this;
- }
- public Builder ClearWebsite() {
- PrepareBuilder();
- result.hasWebsite = false;
- result.website_ = "http://www.itsvse.com/";
- return this;
- }
-
- public bool HasData {
- get { return result.hasData; }
- }
- public pb::ByteString Data {
- get { return result.Data; }
- set { SetData(value); }
- }
- public Builder SetData(pb::ByteString value) {
- pb::ThrowHelper.ThrowIfNull(value, "value");
- PrepareBuilder();
- result.hasData = true;
- result.data_ = value;
- return this;
- }
- public Builder ClearData() {
- PrepareBuilder();
- result.hasData = false;
- result.data_ = pb::ByteString.Empty;
- return this;
- }
- }
- static MyRequest() {
- object.ReferenceEquals(global::ProtoMyRequest.Descrip{过滤}tor, null);
- }
- }
- #endregion
- #endregion Designer generated code
复制代码 3:下面是我们的客户端代码,如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading;
- namespace ProtobufDemo
- {
- class Program
- {
- private static TcpListener server;
- static void Main(string[] args)
- {
- //启动服务端
- server = new TcpListener(IPAddress.Parse("127.0.0.1"), 12345);
- server.Start();
- new Thread(new ThreadStart(ServiceRun)) { IsBackground = true }.Start();
- Console.WriteLine("SERVER : 开启监听 ---");
- Console.ReadKey();
- }
- private static void ServiceRun()
- {
- while (true)
- {
- TcpClient client = server.AcceptTcpClient();//接受一个Client
- //用用户连接进来
- ThreadPool.QueueUserWorkItem(clientConnected, client);
- }
- }
- private static void clientConnected(object obj)
- {
- TcpClient client = (TcpClient)obj;
- Console.WriteLine("SERVER : 客户端已连接,数据读取中 --- ");
- byte[] myRequestBuffer = new byte[1024];
- try
- {
- //获取网络流
- using (NetworkStream stream = client.GetStream())
- {
- //读取网络流中的数据
- int myRequestLength = 0;
- do
- {
- myRequestLength = stream.Read(myRequestBuffer, 0, myRequestBuffer.Length);
- }
- while (stream.DataAvailable);
- myRequestBuffer = myRequestBuffer.RemoveEmptyByte(myRequestLength);
- //反序列化
- MyRequest request = MyRequest.ParseFrom(myRequestBuffer);
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine(System.Text.Encoding.UTF8.GetString(myRequestBuffer));
- Console.WriteLine(ex.Message);
- }
- //关闭client
- client.Close();
-
- }
- }
- /// <summary>
- /// 扩展方法
- /// </summary>
- public static class ExtensionClass
- {
- public static byte[] RemoveEmptyByte(this byte[] by, int length)
- {
- byte[] returnByte = new byte[length];
- for (int i = 0; i < length; i++)
- {
- returnByte[i] = by[i];
- }
- return returnByte;
- }
- }
- }
复制代码
|