在新版本的Beetle.NetPackage開源組件中集成了對Protobuf的支持,在android下能夠簡單地使用Beetle.NetPackage實現基於Protobuf的TCP通信數據交互.下詳細講解實現一個網絡訂單管理功能的過程. java
既然使用Probobuf進行數據交互,那就須要基於Protobuf制定一系列的通訊對象,主要包括數據請求和應答的數據對象格式.在作以前須要把需求整理一下明確一下有那些功能,因爲Demo主要是用於介紹一下protobuf在Beetle.NetPackage下的使用因此功能並不複雜包括:訂單分頁查詢和訂單明細查看.具體Protobuf定義以下: android
package ordermanager; option java_package = "com.beetle.samples.ordermanager"; option java_outer_classname = "orderproto"; message GetEmployee { optional string Name=1; } message GetEmployeeResponse { repeated Employee Items=1; } message Employee { optional string ID=1; optional string Name=2; } message GetCustomer { optional string Name=1; } message GetCustomerResponse { repeated Customer Items =1; } message Customer { optional string ID=1; optional string Name=2; } message Response { optional string Error=1; optional string Type =2; } message OrderSearch { optional string Employee=1; optional int32 PageIndex=2; optional string Customer =3; optional string FromDate =4; optional string ToDate =5; } message OrderSearchResponse { repeated Order Items =1; optional int32 PageIndex =2; optional int32 Pages =3; } message Order { optional string OrderID=1; optional string Employee =2; optional string Customer =3; optional string OrderDate=4; optional string RequiredDate=5; optional string ShippedDate=6; optional string ShipName=7; optional string ShipAddress=8; optional string ShipCity =9; optional string ShipRegion=10; } message GetOrderDetail { optional string OrderID =1; } message GetOrderDetailResponse { repeated OrderDetail Items =1; } message OrderDetail { optional string OrderID=1; optional string Product=2; optional double UnitPrice=3; optional int32 Quantity=4; optional float Discount=5; }
主要制定了訂單僱員,客戶,訂單和訂單明細查詢的數據交互格式. git
Beetle.NetPackage基礎通信都已經封裝好了,因此使用起來很是簡單,probotuf的註冊和建立相應的TCP鏈接只須要幾行代碼便可 github
ProtoPackage.Register(orderproto.class); mClient = new NetClient("10.0.2.2", 9088, new ProtoPackage(), this); mClient.Connect();
以上代碼是註冊相關Protobuf對象信息,主要用於Beetle.NetPackage對protobuf進行自動化處理.而後定義一個基於Protobuf解釋器的鏈接對象,交接入到相應IP端口的服務中. 網絡
Beetle.NetPackage提供基礎的Controller功能,所以只須要定義相關消息類型的方法便可. ide
public void OnGetOrderDetali(NetClient client, GetOrderDetailResponse e) { final List<OrderDetail> details = e.getItemsList(); mHandler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub mOrderDetailViewAdapter.clear(); for (OrderDetail item : details) { mOrderDetailViewAdapter.add(item); } mOrderDetailDialog.show(); ListView lv = (ListView) mOrderDetailDialog .findViewById(R.id.lstOrderDetail); lv.setAdapter(mOrderDetailViewAdapter); } }); } public void OnGetCustomerResponse(NetClient client, GetCustomerResponse e) { mCustomers = e.getItemsList(); } public void OnGetEmployeeResponse(NetClient client, GetEmployeeResponse e) { mEmployees = e.getItemsList(); } public void OnOrderSearchRespnose(NetClient client, OrderSearchResponse e) { final List<Order> orders = e.getItemsList(); mPages = e.getPages(); mHandler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub mOrderViewAdapter.clear(); for (Order item : orders) { mOrderViewAdapter.add(item); } mOrderViewAdapter.notifyDataSetChanged(); } }); }
經過調用如下方法則能夠自動切入到相關消息方法中. post
@Override public void Receive(NetClient client, Object msg) { Controller.Invoke(this, mClient, msg); }
GetCustomer.Builder getcusomer = GetCustomer.newBuilder(); mClient.Send(getcusomer.build()); GetEmployee.Builder getemployee = GetEmployee.newBuilder(); mClient.Send(getemployee.build());
下載 ui
https://beetlenp.codeplex.com/ this
*--------------------------------------
*我的站:www.ikende.com www.asquestion.com
*我的開源項目github.com/IKende
*--------------------------------------* spa