在新版本的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的支持.

下载sample

组件开源官网:https://beetlenp.codeplex.com/

wp8使用Beetle.NetPackage实现基于TCP通讯的订单查询的更多相关文章

  1. .Net开发笔记(十五) 基于“泵”的TCP通讯(接上篇)

    上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的两个Demo,也都采用了“泵”模式 ...

  2. 基于“泵”的TCP通讯(接上篇)

    基于“泵”的TCP通讯(接上篇) 上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的 ...

  3. 基于TCP协议的网络通讯流程

    不多说了,先上个图: 从上面的图中可以看出来,基于TCP协议进行通讯可以大致分成以下几个阶段: 1. 首先是在服务器端, TCP Sever调用socket(), bind(), listen()完成 ...

  4. 基于TCP实现的Socket通讯详解

    Socket通信是基于TCP协议进行的传输层通信,是在应用和应用之间的通信,一般应用在即时通讯上. 建立连接 用Socket创建连接需要在客户端和服务端都使用socket套接字. Linux内存创建S ...

  5. 基于STM32和W5500的Modbus TCP通讯

    在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现. 1.移植千的准备工作 为了实现Modbus TCP ...

  6. Qt:基于TCP和UDP的局域网P2P(局域网)通讯封装

    封装了一个类,可以进行在局域网进行P2P通讯(仅局域网可用) 也就是说,假设局域网中有10台电脑,那么从本机发出的数据,将依次派发到这10台电脑(目前的设计中包括自己这台) 在使用方面,构造的时候给端 ...

  7. 基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据

    最近要在QT下开发Tcp通讯,发送序列化数据以便于接收. 这里涉及到几个问题: 1.QTcpSocket.QTcpServer的通讯 2.QDataStream序列化数据 多的不说,直接上干货!!! ...

  8. Qt NetWork即时通讯网络聊天室(基于TCP)

    本文使用QT的网络模块来创建一个网络聊天室程序,主要包括以下功能: 1.基于TCP的可靠连接(QTcpServer.QTcpSocket) 2.一个服务器,多个客户端 3.服务器接收到某个客户端的请求 ...

  9. 使用Beetle.NetPackage简单实现android和wp聊天

    Beetle.NetPackage是一个多台平开源Client TCP通讯组件,它针对不同平台提供统一的消息描述规则和使用规范可以简单实现多平台下TCP通讯交互.下而介绍通过Beetle.NetPac ...

随机推荐

  1. 磁共振成像SENSE 并行加速重建 g-factor计算方法(待更新)

    MRI SENSE 并行图像加速重建 g-factor计算方法: Matlab代码如下: function g=gfactor_noise(map,LOSS,Rx,Ry) % map -> se ...

  2. BJOI2019Day1 数据&标程&题解

    链接: https://pan.baidu.com/s/16L5GHvo9WtY20sZoqjuQNQ 提取码: 3iur

  3. Do Now 一个让你静心学习的APP——团队博客

    Do Now 一个让你静心学习的APP 来自油条只要半根团队的智慧凝聚的产物! 团队博客总目录: 团队作业第一周 团队作业第二周 Do Now -- 团队冲刺博客一 Do-Now-团队Scrum 冲刺 ...

  4. 网页加水印 svg 方式

    /** *网页加水印 svg 方式 * * @export * @param {*} [{ * container = document.body, * content = '请勿外传', * wid ...

  5. 用gulp-imageisux智图api压缩图片

    ➣ 智图平台是什么? 智图是腾讯ISUX前端团队开发的一个专门用于图片压缩和图片格式转换的平台,其功能包括针对png,jpeg,gif等各类格式图片的压缩,以及为上传图片自动选择最优的图片格式.同时, ...

  6. 31 ArcGIS中后缀一览表(持续更新中……)

  7. python 可迭代对象 迭代器 生成器总结

    可迭代对象 只要有魔法方法__iter__的就是可迭代对象  list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...

  8. vs2013新建asp.net web 项目报错,此模板尝试加载组件程序集NuGet Package Manage

    打开vs2013,工具->扩展和更新->联机->找到NuGet Package Manager->安装->重新启动vs2013

  9. 1 eclipse 离线安装activiti插件

    第一步:下载需要的离线activiti文件: 链接:https://pan.baidu.com/s/1-_XjIsuZfhiEZn6iLul6-Q  密码:mfyk  (这是其他网友的链接) 第二步: ...

  10. 亿级SQL Server运维的最佳实践PPT分享

    这次分享是我在微软的一次分享,关于SQL Server运维最佳实践的部分,由于受众来自不同背景,因此我让分享在一个更加抽象的角度进行,PPT分享如下: 点击这里进行下载