在新版本的Beetle.NetPackage中提供了对Protobuf和Controller的支持,所以在WP8下使用Beetle.NetPackage进行基于TCP的数据交互则一件非常简单事情.下面通过组件在WP8下简单实现基于TCP通讯的订单在线查询功能.
协议定义
为了简化交互数据的处理在这里使用Protobuf来描述数据交互,通过Protobuf制订一系列的请求和应答对象来代替平常在TCP下繁琐的数据流处理过程.下面通过Protobuf来描述订单查询的通讯协议.
[ProtoContract]
public class GetCustomer
{
[ProtoMember()]
public string Name { get; set; }
} [ProtoContract]
public class GetCustomerResponse
{ [ProtoMember()]
public IList<Customer> Items
{
get;
set;
} } [ProtoContract]
public class Customer
{
[ProtoMember()]
public string ID
{
get;
set;
}
[ProtoMember()]
public string Name
{
get;
set;
}
public override string ToString()
{
return Name;
}
} [ProtoContract]
public class GetEmployee
{
[ProtoMember()]
public string Name { get; set; }
} [ProtoContract]
public class GetEmployeeResponse
{
[ProtoMember()]
public IList<Employee> Items
{
get;
set;
}
} [ProtoContract]
public class Employee
{ [ProtoMember()]
public string ID
{
get;
set;
}
[ProtoMember()]
public string Name
{
get;
set;
}
public override string ToString()
{
return Name;
} } [ProtoContract]
public class OrderSearch
{
[ProtoMember()]
public string Employee { get; set; }
[ProtoMember()]
public int PageIndex { get; set; }
[ProtoMember()]
public string Customer { get; set; }
[ProtoMember()]
public string FromDate { get; set; }
[ProtoMember()]
public string ToDate { get; set; }
} [ProtoContract]
public class OrderSearchResponse
{
[ProtoMember()]
public IList<Order> Items
{
get;
set;
}
[ProtoMember()]
public int PageIndex
{
get;
set;
}
[ProtoMember()]
public int Pages
{
get;
set;
}
} [ProtoContract]
public class Order
{
[ProtoMember()]
public string OrderID { get; set; }
[ProtoMember()]
public string Employee { get; set; }
[ProtoMember()]
public string Customer { get; set; }
[ProtoMember()]
public string OrderDate { get; set; }
[ProtoMember()]
public string RequiredDate { get; set; }
[ProtoMember()]
public string ShippedDate { get; set; }
[ProtoMember()]
public string ShipName { get; set; }
[ProtoMember()]
public string ShipAddress { get; set; }
[ProtoMember()]
public string ShipCity { get; set; }
[ProtoMember()]
public string ShipRegion { get; set; }
} [ProtoContract]
public class GetOrderDetail
{
[ProtoMember()]
public string OrderID { get; set; }
} [ProtoContract]
public class GetOrderDetailResponse
{
[ProtoMember()]
public IList<OrderDetail> Items
{
get;
set;
}
} [ProtoContract]
public class OrderDetail
{
[ProtoMember()]
public string OrderID { get; set; }
[ProtoMember()]
public string Product { get; set; }
[ProtoMember()]
public double UnitPrice { get; set; }
[ProtoMember()]
public int Quantity { get; set; }
[ProtoMember()]
public float Discount { get; set; }
}
由于这里使用了protobuf-net,所以通过类和特性来结合,其实规范方便其他平台处理还是建议使用proto文件描述来生成对应的类,这样可以方便生成C++,JAVA等不同平台的交互对象.
定义TCP通讯对象
通过Beetle.NetPackage对protobuf的支持,在WP8下建立相应的TCP通讯是件非常简单的事情.
Beetle.NetPackage.ProtoPakcage.Register(typeof(MainPage).Assembly);
if (mClient == null)
{
mClient = new Beetle.NetPackage.NetClient("192.168.0.104", , new Beetle.NetPackage.ProtoPakcage(), this);
mClient.LittleEndian = false;
}
mClient.Connect();
在使用protobuf前通过ProtoPakcage.Register把程序集下面对应的protobuf消息注册到组件中,然后创建相应的NetClient就可以进行数据通讯.在这里为了和android交互兼容把client的LittleEndian属性设置成false即在处理数据过程采用高字序作为一些数据类型的处理方式.
消息路由分发
在新版本的Beetle.NetPackage中提供简单的消息路由功能,因此在编写消息接收处理的时候再也不需要通过if来判断不同消息去调用方法.使用消息路由并不需开发人员定义复杂的消息规则,只需要定义相应消息类型的参数即可让组件帮助完成这个事情.
public void OnSearchOrderResponse(Beetle.NetPackage.NetClient client, OrderSearchResponse e)
{
if (e.Items == null)
lstOrders.ItemsSource = null;
else
lstOrders.ItemsSource = e.Items.ToList();
mPageIndex = e.PageIndex;
mPages = e.Pages;
} public void OnGetEmployee(Beetle.NetPackage.NetClient client, GetEmployeeResponse e)
{
mEmployees = e.Items;
lstEmployee.ItemsSource = e.Items.ToList();
}
public void OnGetCustomer(Beetle.NetPackage.NetClient client, GetCustomerResponse e)
{
mCustomers = e.Items;
lstCustomer.ItemsSource = e.Items.ToList(); }
public void OnGetOrderDetail(Beetle.NetPackage.NetClient client, GetOrderDetailResponse e)
{
DialogOrderDetail detail = new DialogOrderDetail();
CustomMessageBox mOrderDetailDialog = new CustomMessageBox
{
Content = detail,
Title = "OrderDetail",
RightButtonContent = "OK"
};
detail.ListSelector.ItemsSource = e.Items.ToList();
mOrderDetailDialog.Show();
}
以上是制定不同消息的处理过程,在接收消息的时候触发这些过程只需要简单地调用Controller.Invoke方法即可完成.
public void ClientReceive(Beetle.NetPackage.NetClient client, object message)
{
this.Dispatcher.BeginInvoke(() =>
{
Beetle.NetPackage.Controller.Invoke(this, mClient, message);
});
}
在消息接收方法中调用Controller.Invoke组件会自动匹配相应消息处理的方法并调用,由于是组件自动匹配所以在制定方法的过程也需要遵循一个规则,就是在一个对象中对应消息处理的方法必须是唯一的.
运行效果
总结
通过Beetle.NetPackage只需要很少量的代码就能完成基于TCP的对象数据交互处理,而开发者是完全不用关心下层的协议处理细节,Beetle.NetPackage不仅仅提供对wp8的支持,还提供对flash和android的支持.
组件开源官网:https://beetlenp.codeplex.com/
wp8使用Beetle.NetPackage实现基于TCP通讯的订单查询的更多相关文章
-
.Net开发笔记(十五) 基于“泵”的TCP通讯(接上篇)
上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的两个Demo,也都采用了“泵”模式 ...
-
基于“泵”的TCP通讯(接上篇)
基于“泵”的TCP通讯(接上篇) 上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的 ...
-
基于TCP协议的网络通讯流程
不多说了,先上个图: 从上面的图中可以看出来,基于TCP协议进行通讯可以大致分成以下几个阶段: 1. 首先是在服务器端, TCP Sever调用socket(), bind(), listen()完成 ...
-
基于TCP实现的Socket通讯详解
Socket通信是基于TCP协议进行的传输层通信,是在应用和应用之间的通信,一般应用在即时通讯上. 建立连接 用Socket创建连接需要在客户端和服务端都使用socket套接字. Linux内存创建S ...
-
基于STM32和W5500的Modbus TCP通讯
在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现. 1.移植千的准备工作 为了实现Modbus TCP ...
-
Qt:基于TCP和UDP的局域网P2P(局域网)通讯封装
封装了一个类,可以进行在局域网进行P2P通讯(仅局域网可用) 也就是说,假设局域网中有10台电脑,那么从本机发出的数据,将依次派发到这10台电脑(目前的设计中包括自己这台) 在使用方面,构造的时候给端 ...
-
基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据
最近要在QT下开发Tcp通讯,发送序列化数据以便于接收. 这里涉及到几个问题: 1.QTcpSocket.QTcpServer的通讯 2.QDataStream序列化数据 多的不说,直接上干货!!! ...
-
Qt NetWork即时通讯网络聊天室(基于TCP)
本文使用QT的网络模块来创建一个网络聊天室程序,主要包括以下功能: 1.基于TCP的可靠连接(QTcpServer.QTcpSocket) 2.一个服务器,多个客户端 3.服务器接收到某个客户端的请求 ...
-
使用Beetle.NetPackage简单实现android和wp聊天
Beetle.NetPackage是一个多台平开源Client TCP通讯组件,它针对不同平台提供统一的消息描述规则和使用规范可以简单实现多平台下TCP通讯交互.下而介绍通过Beetle.NetPac ...
随机推荐
-
为 Sublime Text 3059 配置 PHP 编译环境
关于 Sublime Text 3059 的安装及汉化 请参看 http://www.xiumu.org/note/sublime-text-3.shtml 为 sublime Text 配置 PH ...
-
mysql数据库迁移
由于yum安装mysql的时候,数据库的data目录默认是在/var/lib下,出于数据安全性的考虑需要把它挪到/data分区.步骤如下: 一.关闭apache和mysql. 复制代码 代码如下: s ...
-
bzoj3223 文艺平衡树 (treap or splay分裂+合并)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3313 Solved: 1883 [Submit][S ...
-
Session初识
web服务器没有短期记忆,所以需要使用session来跟踪用户的整个会话活动.会话管理有3种解决方案: 1)使用隐藏域(很少使用) 在显示页面中使用隐藏域来保存会话ID.例如,在JSP中将input标 ...
-
jQuery中的DOM操作<;思维导图>;
DOM是Document Object Model的缩写,意思是文档对象模型.DOM是一种与浏览器.平台.语言无关的接口.使用该接口可以轻松地访问页面中所有的标准组件.简单来说,DOM解决了Netsc ...
-
Visual Studio使用技巧记录
1.关闭调试,iis express仍显示在托盘中: 工具 ---> 选项 ---> 调试 ---> 编辑并继续,取消选择“编辑并继续”的选择框 2.关闭浏览器一直请求: 在调试旁边 ...
-
linux杂谈(十七):iscsi存储分离技术
1.iscsi简单介绍 iSCSI利用了TCP/IP的port 860 和 3260 作为沟通的渠道.透过两部计算机之间利用iSCSI的协议来交换SCSI命令,让计算机能够透过快速的局域网集线来 ...
-
HDU3572_Task Schedule(网络流最大流)
解题报告 题意: 工厂有m台机器,须要做n个任务.对于一个任务i.你须要花费一个机器Pi天,并且,開始做这个任务的时间要>=Si,完毕这个任务的时间<=Ei. 对于一个任务,仅仅能由一个机 ...
-
(原)关于MEPG-2中的TS流数据格式学习
关于MEPG-2中的TS流数据格式学习 Author:lihaiping1603 原创:http://www.cnblogs.com/lihaiping/p/8572997.html 本文主要记录了, ...
-
maven项目红叉问题
maven项目红叉问题,有的时候是因为代码报错,有的时候是因为JDK的缘故,比如新建Maven项目,默认JDK为5,这时你在pom.xml配置了JDK为8.这时项目就报错了,就需要你update pr ...