在新版本的beetle.netpackage开源组件中集成了对protobuf的支持,在android下可以简单地使用beetle.netpackage实现基于protobuf的tcp通讯数据交互.下详细讲解实现一个网络订单管理功能的过程.
协议定义
既然使用probobuf进行数据交互,那就需要基于protobuf制定一系列的通信对象,主要包括数据请求和应答的数据对象格式.在做之前需要把需求整理一下明确一下有那些功能,由于demo主要是用于介绍一下protobuf在beetle.netpackage下的使用所以功能并不复杂包括:订单分页查询和订单明细查看.具体protobuf定义如下:
-
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;
-
}
复制代码
主要制定了订单雇员,客户,订单和订单明细查询的数据交互格式.
通讯定义
beetle.netpackage基础通讯都已经封装好了,所以使用起来非常简单,probotuf的注册和创建相应的tcp连接只需要几行代码即可
-
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功能,因此只需要定义相关消息类型的方法即可.
-
public void ongetorderdetali(netclient client, getorderdetailresponse e) {
-
final list 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 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();
-
}
-
});
-
}
复制代码
通过调用以下方法则可以自动切入到相关消息方法中.
-
@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());
复制代码
功能截图
下载代码:
beetle.netpackage凯发k8官网下载客户端中心官网:
原文链接: