Skip to main content

 路由器设置 > 新闻资讯 >

对上次Socket有关的项目的想法

2013-08-13 00:06 浏览:

  今天在做java报表时 无意间浏览了一个block 发现了一个好东西就是Google +protobuf ,真心感觉在Socket 项目中自定义协议时,确实有些问题。第 一是效率的问题,第二是性能上存在问题。

  先来介绍一下 protobuf :

  protobuf是一个开源项目(官方站点在“这里 ”),而且是后台很硬的开源项目

  它是鼎鼎大名的Google公司开发出来,并且在Google内部久经考验的一个东东。由此可见,它的作者绝非一般闲杂人等可比.

  它的作用 :

  它的功能和XML 的功能基本相似,懂XML的都知道 就是把某种数据结构的信息,以某种格式保存起来。主要用于数据存储、传输协议格式等场合。

  他和XML 的区别:

  你就会纳闷了,用XML 不就行了,其实不然。XML 跟它 相比还是有点不足之处的,他的缺点主要在XML的序列化和烦序列化上,在序列化上当存在大量冗余数据时,效率,开销就不是客观了,在反序列化上开销挺大的。

  下面的举例 来自网络上的一位大神。

  代码生成机制

  除了性能好,代码生成机制是主要吸引俺的地方。为了说明这个代码生成机制,俺举个例子。

  比如有个电子商务的系统(假设用C++实现),其中的模块A需要发送大量的订单信息给模块B,通讯的方式使用socket。

  假设订单包括如下属性:

  --------------------------------

  时间:time(用整数表示)

  客户id:userid(用整数表示)

  交易金额:price(用浮点数表示)

  交易的描述:desc(用字符串表示)

  --------------------------------

  如果使用protobuf实现,首先要写一个proto文件(不妨叫Order.proto),在该文件中添加一个名为"Order"的message结构,用来描述通讯协议中的结构化数据。该文件的内容大致如下:

  --------------------------------

  message Order

  {

  required int32 time = 1;

  required int32 userid = 2;

  required float price = 3;

  optional string desc = 4;

  }

  --------------------------------

  然后,使用protobuf内置的编译器编译 该proto。由于本例子的模块是C++,你可以通过protobuf编译器的命令行参数(看“这里 ”),让它生成C++语言的“订单包装类”。(一般来说,一个message结构会生成一个包装类)

  然后你使用类似下面的代码来序列化/解析该订单包装类:

  --------------------------------

  // 发送方

  Order order;

  order.set_time(XXXX);

  order.set_userid(123);

  order.set_price(100.0f);

  order.set_desc("a test order");

  string sOrder;

  order.SerailzeToString(&sOrder);

  // 然后调用某种socket的通讯库把序列化之后的字符串发送出去

  // ......

  --------------------------------

  // 接收方

  string sOrder;

  // 先通过网络通讯库接收到数据,存放到某字符串sOrder

  // ......

  Order order;

  if(order.ParseFromString(sOrder)) // 解析该字符串

  {

  cout << "userid:" << order.userid() << endl

  << "desc:" << order.desc() << endl;

  }

  else

  {

  cerr << "parse error!" << endl;

  }

  --------------------------------

  有了这种代码生成机制,开发人员再也不用吭哧吭哧地编写那些协议解析的代码了(干这种活是典型的吃力不讨好)。

  同样在上次的项目中也可以利用它,封装自定义的协议,就可以避免编写协议解析的代码了。

  最后我再补充一下,他是有Google 开发 不久交给开源社区。他的性能不必怀疑。同时他支持 C++ java Paython (官方) 不久有了各种语言的,有民间大神 开发(效率,性能 相比可想而知了)