Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1247104
  • 博文数量: 78
  • 博客积分: 1959
  • 博客等级: 上尉
  • 技术积分: 2709
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-19 12:07
个人简介

樽中酒不空

文章分类

全部博文(78)

文章存档

2024年(2)

2020年(4)

2019年(1)

2017年(2)

2016年(2)

2015年(7)

2014年(11)

2013年(13)

2012年(18)

2011年(2)

2010年(16)

分类: Android平台

2015-04-21 10:59:16

http://my.oschina.net/ikende/blog/159930


在新版本的Beetle.NetPackage开源组件中集成了对Protobuf的支持,在android下可以简单地使用Beetle.NetPackage实现基于Protobuf的TCP通讯数据交互.下详细讲解实现一个网络订单管理功能的过程.


协议定义

既然使用Probobuf进行数据交互,那就需要基于Protobuf制定一系列的通信对象,主要包括数据请求和应答的数据对象格式.在做之前需要把需求整理一下明确一下有那些功能,由于Demo主要是用于介绍一下protobuf在Beetle.NetPackage下的使用所以功能并不复杂包括:订单分页查询和订单明细查看.具体Protobuf定义如下:

  1. package ordermanager;
  2. option java_package = "com.beetle.samples.ordermanager";
  3. option java_outer_classname = "orderproto";

  4. message GetEmployee
  5. {
  6.         optional string Name=1;
  7. }

  8. message GetEmployeeResponse
  9. {
  10.         repeated Employee Items=1;
  11. }

  12. message Employee
  13. {
  14.         optional string ID=1;
  15.         optional string Name=2;
  16. }

  17. message GetCustomer
  18. {
  19.         optional string Name=1;
  20. }

  21. message GetCustomerResponse
  22. {
  23.         repeated Customer Items =1;
  24. }

  25. message Customer
  26. {
  27.         optional string ID=1;
  28.         optional string Name=2;
  29. }

  30. message Response
  31. {
  32.         optional string Error=1;
  33.         optional string Type =2;
  34. }

  35. message OrderSearch
  36. {
  37.         optional string        Employee=1;
  38.         optional int32        PageIndex=2;
  39.         optional string Customer =3;
  40.         optional string FromDate =4;
  41.         optional string ToDate =5;
  42. }
  43. message OrderSearchResponse
  44. {
  45.         repeated Order        Items =1;
  46.         optional int32        PageIndex =2;
  47.         optional int32  Pages =3;
  48. }
  49. message Order
  50. {
  51.         optional string OrderID=1;
  52.         optional string Employee =2;
  53.         optional string Customer =3;
  54.         optional string OrderDate=4;
  55.         optional string RequiredDate=5;
  56.         optional string ShippedDate=6;
  57.         optional string ShipName=7;
  58.         optional string ShipAddress=8;
  59.         optional string ShipCity =9;
  60.         optional string ShipRegion=10;
  61. }
  62. message GetOrderDetail
  63. {
  64.         optional string OrderID =1;
  65. }
  66. message GetOrderDetailResponse
  67. {
  68.         repeated OrderDetail Items =1;
  69. }
  70. message OrderDetail
  71. {
  72.         optional string OrderID=1;
  73.         optional string Product=2;
  74.         optional double UnitPrice=3;
  75.         optional int32        Quantity=4;
  76.         optional float        Discount=5;
  77. }
复制代码

主要制定了订单雇员,客户,订单和订单明细查询的数据交互格式.


通讯定义


Beetle.NetPackage基础通讯都已经封装好了,所以使用起来非常简单,probotuf的注册和创建相应的TCP连接只需要几行代码即可

  1. ProtoPackage.Register(orderproto.class);
  2.         mClient = new NetClient("10.0.2.2", 9088, new ProtoPackage(), this);
  3.         mClient.Connect();
复制代码

以上代码是注册相关Protobuf对象信息,主要用于Beetle.NetPackage对protobuf进行自动化处理.然后定义一个基于Protobuf解释器的连接对象,交接入到相应IP端口的服务中.


消息接收定义

Beetle.NetPackage提供基础的Controller功能,因此只需要定义相关消息类型的方法即可.

  1. public void OnGetOrderDetali(NetClient client, GetOrderDetailResponse e) {
  2.                 final List details = e.getItemsList();

  3.                 mHandler.post(new Runnable() {

  4.                         @Override
  5.                         public void run() {
  6.                                 // TODO Auto-generated method stub
  7.                                 mOrderDetailViewAdapter.clear();
  8.                                 for (OrderDetail item : details) {
  9.                                         mOrderDetailViewAdapter.add(item);
  10.                                 }
  11.                                 mOrderDetailDialog.show();
  12.                                 ListView lv = (ListView) mOrderDetailDialog
  13.                                                 .findViewById(R.id.lstOrderDetail);
  14.                                 lv.setAdapter(mOrderDetailViewAdapter);
  15.                         }
  16.                 });
  17.         }

  18.         public void OnGetCustomerResponse(NetClient client, GetCustomerResponse e) {
  19.                 mCustomers = e.getItemsList();
  20.         }

  21.         public void OnGetEmployeeResponse(NetClient client, GetEmployeeResponse e) {
  22.                 mEmployees = e.getItemsList();
  23.         }

  24.         public void OnOrderSearchRespnose(NetClient client, OrderSearchResponse e) {
  25.                 final List orders = e.getItemsList();
  26.                 mPages = e.getPages();
  27.                 mHandler.post(new Runnable() {

  28.                         @Override
  29.                         public void run() {
  30.                                 // TODO Auto-generated method stub
  31.                                 mOrderViewAdapter.clear();
  32.                                 for (Order item : orders) {
  33.                                         mOrderViewAdapter.add(item);
  34.                                 }
  35.                                 mOrderViewAdapter.notifyDataSetChanged();
  36.                         }
  37.                 });
  38.         }
复制代码
通过调用以下方法则可以自动切入到相关消息方法中.
  1. @Override
  2.         public void Receive(NetClient client, Object msg) {
  3.                 Controller.Invoke(this, mClient, msg);
  4.         }
复制代码
消息发送请求
  1. GetCustomer.Builder getcusomer = GetCustomer.newBuilder();
  2.         mClient.Send(getcusomer.build());
  3.         GetEmployee.Builder getemployee = GetEmployee.newBuilder();
  4.         mClient.Send(getemployee.build());
复制代码
功能截图

         161049_VDXF_1000376.jpg

  


         161107_bLnU_1000376.jpg


下载代码: 
Beetle.NetPackage官网: 


原文链接:http://my.oschina.net/ikende/blog/159930

阅读(4196) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~