架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 13732|回复: 0

[资料] .net/c# Google Protocol Buffers 使用教程

[复制链接]
发表于 2017-5-3 13:27:42 | 显示全部楼层 |阅读模式
.net/c# Google Protocol Buffers 快速入门
http://www.itsvse.com/thread-3626-1-1.html
(出处: 架构师)


上篇文章,我们学习了“.net/c# Google Protocol Buffers 快速入门”的课程。。。


这篇文章,我们学习如何在.net/c#使用他。


1:首先,安装引用包:
  1. Install-Package Google.ProtocolBuffers
复制代码
2:.proto文件转成.cs文件,转换方法,上篇文章已经说了,我就不重复说了,下面转换完成的.cs文件:


  1. // Generated by ProtoGen, Version=2.4.1.555, Culture=neutral, PublicKeyToken=55f7125234beb589.  DO NOT EDIT!
  2. #pragma warning disable 1591, 0612, 3021
  3. #region Designer generated code

  4. using pb = global::Google.ProtocolBuffers;
  5. using pbc = global::Google.ProtocolBuffers.Collections;
  6. using pbd = global::Google.ProtocolBuffers.Descrip{过滤}tors;
  7. using scg = global::System.Collections.Generic;
  8. [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  9. public static partial class ProtoMyRequest {

  10.   #region Extension registration
  11.   public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
  12.   }
  13.   #endregion
  14.   #region Static variables
  15.   internal static pbd::MessageDescrip{过滤}tor internal__static_MyRequest__Descrip{过滤}tor;
  16.   internal static pb::FieldAccess.FieldAccessorTable<global::MyRequest, global::MyRequest.Builder> internal__static_MyRequest__FieldAccessorTable;
  17.   #endregion
  18.   #region Descrip{过滤}tor
  19.   public static pbd::FileDescrip{过滤}tor Descrip{过滤}tor {
  20.     get { return descrip{过滤}tor; }
  21.   }
  22.   private static pbd::FileDescrip{过滤}tor descrip{过滤}tor;
  23.   
  24.   static ProtoMyRequest() {
  25.     byte[] descrip{过滤}torData = global::System.Convert.FromBase64String(
  26.         string.Concat(
  27.           "ChRQcm90b015UmVxdWVzdC5wcm90byJhCglNeVJlcXVlc3QSDwoHdmVyc2lv",
  28.           "bhgBIAIoBRIMCgRuYW1lGAIgAigJEicKB3dlYnNpdGUYAyABKAk6Fmh0dHA6",
  29.         "Ly93d3cuaXRzdnNlLmNvbS8SDAoEZGF0YRgEIAEoDA=="));
  30.     pbd::FileDescrip{过滤}tor.InternalDescrip{过滤}torAssigner assigner = delegate(pbd::FileDescrip{过滤}tor root) {
  31.       descrip{过滤}tor = root;
  32.       internal__static_MyRequest__Descrip{过滤}tor = Descrip{过滤}tor.MessageTypes[0];
  33.       internal__static_MyRequest__FieldAccessorTable =
  34.           new pb::FieldAccess.FieldAccessorTable<global::MyRequest, global::MyRequest.Builder>(internal__static_MyRequest__Descrip{过滤}tor,
  35.               new string[] { "Version", "Name", "Website", "Data", });
  36.       return null;
  37.     };
  38.     pbd::FileDescrip{过滤}tor.InternalBuildGeneratedFileFrom(descrip{过滤}torData,
  39.         new pbd::FileDescrip{过滤}tor[] {
  40.         }, assigner);
  41.   }
  42.   #endregion
  43.   
  44. }
  45. #region Messages
  46. [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  47. public sealed partial class MyRequest : pb::GeneratedMessage<MyRequest, MyRequest.Builder> {
  48.   private MyRequest() { }
  49.   private static readonly MyRequest defaultInstance = new MyRequest().MakeReadOnly();
  50.   private static readonly string[] _myRequestFieldNames = new string[] { "data", "name", "version", "website" };
  51.   private static readonly uint[] _myRequestFieldTags = new uint[] { 34, 18, 8, 26 };
  52.   public static MyRequest DefaultInstance {
  53.     get { return defaultInstance; }
  54.   }
  55.   
  56.   public override MyRequest DefaultInstanceForType {
  57.     get { return DefaultInstance; }
  58.   }
  59.   
  60.   protected override MyRequest ThisMessage {
  61.     get { return this; }
  62.   }
  63.   
  64.   public static pbd::MessageDescrip{过滤}tor Descrip{过滤}tor {
  65.     get { return global::ProtoMyRequest.internal__static_MyRequest__Descrip{过滤}tor; }
  66.   }
  67.   
  68.   protected override pb::FieldAccess.FieldAccessorTable<MyRequest, MyRequest.Builder> InternalFieldAccessors {
  69.     get { return global::ProtoMyRequest.internal__static_MyRequest__FieldAccessorTable; }
  70.   }
  71.   
  72.   public const int VersionFieldNumber = 1;
  73.   private bool hasVersion;
  74.   private int version_;
  75.   public bool HasVersion {
  76.     get { return hasVersion; }
  77.   }
  78.   public int Version {
  79.     get { return version_; }
  80.   }
  81.   
  82.   public const int NameFieldNumber = 2;
  83.   private bool hasName;
  84.   private string name_ = "";
  85.   public bool HasName {
  86.     get { return hasName; }
  87.   }
  88.   public string Name {
  89.     get { return name_; }
  90.   }
  91.   
  92.   public const int WebsiteFieldNumber = 3;
  93.   private bool hasWebsite;
  94.   private string website_ = "http://www.itsvse.com/";
  95.   public bool HasWebsite {
  96.     get { return hasWebsite; }
  97.   }
  98.   public string Website {
  99.     get { return website_; }
  100.   }
  101.   
  102.   public const int DataFieldNumber = 4;
  103.   private bool hasData;
  104.   private pb::ByteString data_ = pb::ByteString.Empty;
  105.   public bool HasData {
  106.     get { return hasData; }
  107.   }
  108.   public pb::ByteString Data {
  109.     get { return data_; }
  110.   }
  111.   
  112.   public override bool IsInitialized {
  113.     get {
  114.       if (!hasVersion) return false;
  115.       if (!hasName) return false;
  116.       return true;
  117.     }
  118.   }
  119.   
  120.   public override void WriteTo(pb::ICodedOutputStream output) {
  121.     CalcSerializedSize();
  122.     string[] field_names = _myRequestFieldNames;
  123.     if (hasVersion) {
  124.       output.WriteInt32(1, field_names[2], Version);
  125.     }
  126.     if (hasName) {
  127.       output.WriteString(2, field_names[1], Name);
  128.     }
  129.     if (hasWebsite) {
  130.       output.WriteString(3, field_names[3], Website);
  131.     }
  132.     if (hasData) {
  133.       output.WriteBytes(4, field_names[0], Data);
  134.     }
  135.     UnknownFields.WriteTo(output);
  136.   }
  137.   
  138.   private int memoizedSerializedSize = -1;
  139.   public override int SerializedSize {
  140.     get {
  141.       int size = memoizedSerializedSize;
  142.       if (size != -1) return size;
  143.       return CalcSerializedSize();
  144.     }
  145.   }
  146.   
  147.   private int CalcSerializedSize() {
  148.     int size = memoizedSerializedSize;
  149.     if (size != -1) return size;
  150.    
  151.     size = 0;
  152.     if (hasVersion) {
  153.       size += pb::CodedOutputStream.ComputeInt32Size(1, Version);
  154.     }
  155.     if (hasName) {
  156.       size += pb::CodedOutputStream.ComputeStringSize(2, Name);
  157.     }
  158.     if (hasWebsite) {
  159.       size += pb::CodedOutputStream.ComputeStringSize(3, Website);
  160.     }
  161.     if (hasData) {
  162.       size += pb::CodedOutputStream.ComputeBytesSize(4, Data);
  163.     }
  164.     size += UnknownFields.SerializedSize;
  165.     memoizedSerializedSize = size;
  166.     return size;
  167.   }
  168.   public static MyRequest ParseFrom(pb::ByteString data) {
  169.     return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
  170.   }
  171.   public static MyRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
  172.     return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
  173.   }
  174.   public static MyRequest ParseFrom(byte[] data) {
  175.     return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
  176.   }
  177.   public static MyRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
  178.     return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
  179.   }
  180.   public static MyRequest ParseFrom(global::System.IO.Stream input) {
  181.     return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
  182.   }
  183.   public static MyRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
  184.     return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
  185.   }
  186.   public static MyRequest ParseDelimitedFrom(global::System.IO.Stream input) {
  187.     return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
  188.   }
  189.   public static MyRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
  190.     return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
  191.   }
  192.   public static MyRequest ParseFrom(pb::ICodedInputStream input) {
  193.     return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
  194.   }
  195.   public static MyRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
  196.     return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
  197.   }
  198.   private MyRequest MakeReadOnly() {
  199.     return this;
  200.   }
  201.   
  202.   public static Builder CreateBuilder() { return new Builder(); }
  203.   public override Builder ToBuilder() { return CreateBuilder(this); }
  204.   public override Builder CreateBuilderForType() { return new Builder(); }
  205.   public static Builder CreateBuilder(MyRequest prototype) {
  206.     return new Builder(prototype);
  207.   }
  208.   
  209.   [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  210.   public sealed partial class Builder : pb::GeneratedBuilder<MyRequest, Builder> {
  211.     protected override Builder ThisBuilder {
  212.       get { return this; }
  213.     }
  214.     public Builder() {
  215.       result = DefaultInstance;
  216.       resultIsReadOnly = true;
  217.     }
  218.     internal Builder(MyRequest cloneFrom) {
  219.       result = cloneFrom;
  220.       resultIsReadOnly = true;
  221.     }
  222.    
  223.     private bool resultIsReadOnly;
  224.     private MyRequest result;
  225.    
  226.     private MyRequest PrepareBuilder() {
  227.       if (resultIsReadOnly) {
  228.         MyRequest original = result;
  229.         result = new MyRequest();
  230.         resultIsReadOnly = false;
  231.         MergeFrom(original);
  232.       }
  233.       return result;
  234.     }
  235.    
  236.     public override bool IsInitialized {
  237.       get { return result.IsInitialized; }
  238.     }
  239.    
  240.     protected override MyRequest MessageBeingBuilt {
  241.       get { return PrepareBuilder(); }
  242.     }
  243.    
  244.     public override Builder Clear() {
  245.       result = DefaultInstance;
  246.       resultIsReadOnly = true;
  247.       return this;
  248.     }
  249.    
  250.     public override Builder Clone() {
  251.       if (resultIsReadOnly) {
  252.         return new Builder(result);
  253.       } else {
  254.         return new Builder().MergeFrom(result);
  255.       }
  256.     }
  257.    
  258.     public override pbd::MessageDescrip{过滤}tor Descrip{过滤}torForType {
  259.       get { return global::MyRequest.Descrip{过滤}tor; }
  260.     }
  261.    
  262.     public override MyRequest DefaultInstanceForType {
  263.       get { return global::MyRequest.DefaultInstance; }
  264.     }
  265.    
  266.     public override MyRequest BuildPartial() {
  267.       if (resultIsReadOnly) {
  268.         return result;
  269.       }
  270.       resultIsReadOnly = true;
  271.       return result.MakeReadOnly();
  272.     }
  273.    
  274.     public override Builder MergeFrom(pb::IMessage other) {
  275.       if (other is MyRequest) {
  276.         return MergeFrom((MyRequest) other);
  277.       } else {
  278.         base.MergeFrom(other);
  279.         return this;
  280.       }
  281.     }
  282.    
  283.     public override Builder MergeFrom(MyRequest other) {
  284.       if (other == global::MyRequest.DefaultInstance) return this;
  285.       PrepareBuilder();
  286.       if (other.HasVersion) {
  287.         Version = other.Version;
  288.       }
  289.       if (other.HasName) {
  290.         Name = other.Name;
  291.       }
  292.       if (other.HasWebsite) {
  293.         Website = other.Website;
  294.       }
  295.       if (other.HasData) {
  296.         Data = other.Data;
  297.       }
  298.       this.MergeUnknownFields(other.UnknownFields);
  299.       return this;
  300.     }
  301.    
  302.     public override Builder MergeFrom(pb::ICodedInputStream input) {
  303.       return MergeFrom(input, pb::ExtensionRegistry.Empty);
  304.     }
  305.    
  306.     public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
  307.       PrepareBuilder();
  308.       pb::UnknownFieldSet.Builder unknownFields = null;
  309.       uint tag;
  310.       string field_name;
  311.       while (input.ReadTag(out tag, out field_name)) {
  312.         if(tag == 0 && field_name != null) {
  313.           int field_ordinal = global::System.Array.BinarySearch(_myRequestFieldNames, field_name, global::System.StringComparer.Ordinal);
  314.           if(field_ordinal >= 0)
  315.             tag = _myRequestFieldTags[field_ordinal];
  316.           else {
  317.             if (unknownFields == null) {
  318.               unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
  319.             }
  320.             ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
  321.             continue;
  322.           }
  323.         }
  324.         switch (tag) {
  325.           case 0: {
  326.             throw pb::InvalidProtocolBufferException.InvalidTag();
  327.           }
  328.           default: {
  329.             if (pb::WireFormat.IsEndGroupTag(tag)) {
  330.               if (unknownFields != null) {
  331.                 this.UnknownFields = unknownFields.Build();
  332.               }
  333.               return this;
  334.             }
  335.             if (unknownFields == null) {
  336.               unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
  337.             }
  338.             ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
  339.             break;
  340.           }
  341.           case 8: {
  342.             result.hasVersion = input.ReadInt32(ref result.version_);
  343.             break;
  344.           }
  345.           case 18: {
  346.             result.hasName = input.ReadString(ref result.name_);
  347.             break;
  348.           }
  349.           case 26: {
  350.             result.hasWebsite = input.ReadString(ref result.website_);
  351.             break;
  352.           }
  353.           case 34: {
  354.             result.hasData = input.ReadBytes(ref result.data_);
  355.             break;
  356.           }
  357.         }
  358.       }
  359.       
  360.       if (unknownFields != null) {
  361.         this.UnknownFields = unknownFields.Build();
  362.       }
  363.       return this;
  364.     }
  365.    
  366.    
  367.     public bool HasVersion {
  368.       get { return result.hasVersion; }
  369.     }
  370.     public int Version {
  371.       get { return result.Version; }
  372.       set { SetVersion(value); }
  373.     }
  374.     public Builder SetVersion(int value) {
  375.       PrepareBuilder();
  376.       result.hasVersion = true;
  377.       result.version_ = value;
  378.       return this;
  379.     }
  380.     public Builder ClearVersion() {
  381.       PrepareBuilder();
  382.       result.hasVersion = false;
  383.       result.version_ = 0;
  384.       return this;
  385.     }
  386.    
  387.     public bool HasName {
  388.       get { return result.hasName; }
  389.     }
  390.     public string Name {
  391.       get { return result.Name; }
  392.       set { SetName(value); }
  393.     }
  394.     public Builder SetName(string value) {
  395.       pb::ThrowHelper.ThrowIfNull(value, "value");
  396.       PrepareBuilder();
  397.       result.hasName = true;
  398.       result.name_ = value;
  399.       return this;
  400.     }
  401.     public Builder ClearName() {
  402.       PrepareBuilder();
  403.       result.hasName = false;
  404.       result.name_ = "";
  405.       return this;
  406.     }
  407.    
  408.     public bool HasWebsite {
  409.       get { return result.hasWebsite; }
  410.     }
  411.     public string Website {
  412.       get { return result.Website; }
  413.       set { SetWebsite(value); }
  414.     }
  415.     public Builder SetWebsite(string value) {
  416.       pb::ThrowHelper.ThrowIfNull(value, "value");
  417.       PrepareBuilder();
  418.       result.hasWebsite = true;
  419.       result.website_ = value;
  420.       return this;
  421.     }
  422.     public Builder ClearWebsite() {
  423.       PrepareBuilder();
  424.       result.hasWebsite = false;
  425.       result.website_ = "http://www.itsvse.com/";
  426.       return this;
  427.     }
  428.    
  429.     public bool HasData {
  430.       get { return result.hasData; }
  431.     }
  432.     public pb::ByteString Data {
  433.       get { return result.Data; }
  434.       set { SetData(value); }
  435.     }
  436.     public Builder SetData(pb::ByteString value) {
  437.       pb::ThrowHelper.ThrowIfNull(value, "value");
  438.       PrepareBuilder();
  439.       result.hasData = true;
  440.       result.data_ = value;
  441.       return this;
  442.     }
  443.     public Builder ClearData() {
  444.       PrepareBuilder();
  445.       result.hasData = false;
  446.       result.data_ = pb::ByteString.Empty;
  447.       return this;
  448.     }
  449.   }
  450.   static MyRequest() {
  451.     object.ReferenceEquals(global::ProtoMyRequest.Descrip{过滤}tor, null);
  452.   }
  453. }

  454. #endregion


  455. #endregion Designer generated code
复制代码
3:下面是我们的客户端代码,如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading;

  8. namespace ProtobufDemo
  9. {
  10.         class Program
  11.         {
  12.                 private static TcpListener server;
  13.                 static void Main(string[] args)
  14.                 {
  15.                         //启动服务端
  16.                         server = new TcpListener(IPAddress.Parse("127.0.0.1"), 12345);
  17.                         server.Start();
  18.                         new Thread(new ThreadStart(ServiceRun)) { IsBackground = true }.Start();
  19.                         Console.WriteLine("SERVER : 开启监听 ---");
  20.                         Console.ReadKey();
  21.                 }

  22.                 private static void ServiceRun()
  23.                 {
  24.                         while (true)
  25.                         {
  26.                                 TcpClient client = server.AcceptTcpClient();//接受一个Client  
  27.                                 //用用户连接进来
  28.                                 ThreadPool.QueueUserWorkItem(clientConnected, client);
  29.                         }
  30.                 }

  31.                 private static void clientConnected(object obj)
  32.                 {
  33.                         TcpClient client = (TcpClient)obj;
  34.                         Console.WriteLine("SERVER : 客户端已连接,数据读取中 --- ");
  35.                         byte[] myRequestBuffer = new byte[1024];
  36.                         try
  37.                         {
  38.                                 //获取网络流  
  39.                                 using (NetworkStream stream = client.GetStream())
  40.                                 {
  41.                                         //读取网络流中的数据
  42.                                         int myRequestLength = 0;
  43.                                         do
  44.                                         {
  45.                                                 myRequestLength = stream.Read(myRequestBuffer, 0, myRequestBuffer.Length);
  46.                                         }
  47.                                         while (stream.DataAvailable);
  48.                                         myRequestBuffer = myRequestBuffer.RemoveEmptyByte(myRequestLength);
  49.                                         //反序列化
  50.                                         MyRequest request = MyRequest.ParseFrom(myRequestBuffer);
  51.                                 }
  52.                         }
  53.                         catch (Exception ex)
  54.                         {
  55.                                 Console.WriteLine(System.Text.Encoding.UTF8.GetString(myRequestBuffer));
  56.                                 Console.WriteLine(ex.Message);
  57.                         }
  58.                         //关闭client
  59.                         client.Close();
  60.                        
  61.                 }
  62.         }

  63.         /// <summary>
  64.         /// 扩展方法
  65.         /// </summary>
  66.         public static class ExtensionClass
  67.         {
  68.                 public static byte[] RemoveEmptyByte(this byte[] by, int length)
  69.                 {
  70.                         byte[] returnByte = new byte[length];

  71.                         for (int i = 0; i < length; i++)
  72.                         {
  73.                                 returnByte[i] = by[i];
  74.                         }
  75.                         return returnByte;

  76.                 }
  77.         }
  78. }
复制代码






上一篇:.net/c# 陆金所 稳赢 抢标软件APP协议版[源码]
下一篇:使用 ASP.NET Core 发送邮件
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-1-17 03:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表