文档章节

android使用protobuf实现网络订单管理功能

泥水佬
 泥水佬
发布于 2013/09/08 16:13
字数 718
阅读 3263
收藏 37

        在新版本的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<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();
			}
		});
	}


        通过调用以下方法则可以自动切入到相关消息方法中.

        @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官网

        https://beetlenp.codeplex.com/

*--------------------------------------
*个人站:www.ikende.com www.asquestion.com              
*个人开源项目github.com/IKende             
*--------------------------------------*

© 著作权归作者所有

泥水佬

泥水佬

粉丝 77
博文 95
码字总数 65026
作品 7
广州
架构师
私信 提问
Google protobuf与Socket通信数据流

Google protobuf与Socket通信数据流,IM通信数据流; 1. protobuf的使用与集成,protobuf生成Java Proto文件? 2. android使用wire方式生成protobuf的Java文件? Protobuf Plugin for Gradle...

desaco
01/31
0
0
在网络通讯中应用Protobuf

Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强;还有一个比较大的优点就是有着很多的语言平台支持。下面...

泥水佬
2013/08/28
7.5K
16
Beetle.NetPackage加入Protobuf的支持(android,wp8)

Protobuf非常适合处理对象数据在网络方面通讯,所以Beetle.NetPackage加入了对Protobuf的支持,提供支持的平台有android和windows phone 8. android mClient =new NetClient("10.0.2.2", 908......

泥水佬
2013/08/25
331
0
关一Socket得到的InputStream,read方法最后一直阻塞的问题

今天在尝试使用protobuf在服务端和android进行数据转递和解析时遇到一个小问题,这里记录一下。大概的场景是pc与android使用socket通信,pc为服务端,android向服务端发送请求后,服务端将p...

jimmywu911
2014/11/12
11.2K
2
protobuf,json,xml,binary,Thrift之间的对比

golang 使用 protobuf 的教程 golang使用protobuf 一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,总体看来ProtoBuf的优势还是很明...

mickelfeng
2018/11/19
444
0

没有更多内容

加载失败,请刷新页面

加载更多

CQRS与AXON

CQRS 看了蛮多文章,只会CRUD,却不懂CQRS,CQRS是遵循DDD思想而产生的一种模式,Command and Query Responsibility Segregation 命令与查询隔离。查询就直接通过正常的模式service调dao层。...

无极之岚
17分钟前
2
0
OSChina 周三乱弹 —— 欢迎你来做产品经理

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :10多次劲歌金曲获奖,更多叱咤歌坛排名,黎明才应该是四大天王之首,只可惜拍的电影太少。单曲循环一个多月的歌,力荐 《无名份的...

小小编辑
32分钟前
37
2
500行代码,教你用python写个微信飞机大战

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!...

上海小胖
今天
8
0
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部