在新版本的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. 使用JumpServer管理你的服务器

    本文介绍CentOS 7从安装jumpserver到简单使用jumpserver管理服务器. 1.Jumpserver介绍 Jumpserver是一款开源的开源的堡垒机,如下图是官网介绍. 官网地址: ...

  2. dnmp(docker的lnmp)安装WordPress之后图片上传问题 问题:图片上传大小问题解决和 报错413 Request Entity Too Large

    首先是提示超过图片尺寸和大小, 最后发现都是图片大小的问题, 需要修改php的最大上传size 修改之后查看php配置  已经生效  但是还是报错, 提示返回不是合法的json,  查看控制台, 报错 ...

  3. Android Getting Started

    Building Your First App Creating an Android Project 介绍如何Android开发环境,具体是:怎么使用Eclipse工具 Create a Proje ...

  4. python 基本认证

    # import requests # # response = requests.get('http://127.0.0.1:8080/manager/html', auth=('tomcat', ...

  5. Sqoop葵花宝典

    Sqoop葵花宝典 基于Sqoop1.x 场景 导入流程 graph LR A[RDBMS] -->|Sqoop| B(Hive) 导出流程 graph LR A[Hive] -->|Sq ...

  6. 手动安装composer详细教学

    1.下载compser.phar 地址 https://getcomposer.org/download/ 2.新建composer.bat 文件,写入“@php "%~dp0compose ...

  7. 微信小程序ios点击状态栏返回顶部不好使

    最近做了一款微信小程序,各方面感觉都很完美(萝卜一直这么自信),今天设计总监告诉我你的小程序怎么返回顶部不好使呀,吓得我赶紧拿手机试试,没毛病啊,我手机(苦逼的安卓机)上点两下就回去了呀,遂去找他理论 ...

  8. Python入门(白银篇)

    一.变量.元组的赋值和循环删除 (1)多个变量同时赋值 #多个变量赋值a,b,c,d=1,2,3,4x=y=m=n=520print(a,b,c,d,x,y,m,n) (2)不引入第三方变量下,交换a ...

  9. 美团App用户界面分析

    关于美团 美团网成立于2010年,合并前是中国销售额最大的独立团购 App.美团网2014年全年交易额突破460亿元,较去年增长180%以上,市场份额占比超60%,用户数超2亿~ 美团 App 用户界 ...

  10. [Swift]LeetCode92. 反转链表 II | Reverse Linked List II

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...