在新版本的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. Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)

    <题目链接> 题目大意:给定一个无向图,该无向图不含自环,且无重边.现在要你将这个无向图定向,使得不存在任何一条路径长度大于等于2.然后根输入边的顺序,输出构造的有向图.如果构造的边与输入 ...

  2. 一、OpenStack环境准备及共享组件安装

    一.OpenStack部署环境准备: 1.关闭防火墙所有虚拟机都要操作 # setenforce 0 # systemctl stop firewalld 2.域名解析所有虚拟机都要操作 # cat ...

  3. 腾讯云服务器、nginx部署loopback

    最近在研究学习nginx,买了腾讯云服务器.在阿里上申请了域名,部署项目遇到很多问题记录一下,以备后用: 1.在腾讯服务器买好,阿里域名申请好后(也可以在腾讯上申请域名),需要添加安全组,创建不同的规 ...

  4. 爬虫之图片懒加载技术及js加密

    图片懒加载 图片懒加载概念: 图片懒加载是一种网页优化技术.图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间.为了 ...

  5. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  6. 练习2-1 Programming in C is fun!

    练习2-1 Programming in C is fun! 一 问题描述 本题要求编写程序,输出一个短句“Programming in C is fun!”. 输入格式: 本题目没有输入. 输出格式 ...

  7. That girl

    音标 词汇 Purple Glasses Black Hat Brown Bag Clothes Blue Jacket Pink Handbag Sock White Skirt Shoe 1, s ...

  8. Linux 下redis 集群搭建练习

    Redis集群 学习参考:https://blog.csdn.net/jeffleo/article/details/54848428https://my.oschina.net/iyinghui/b ...

  9. tyflow雨滴在物体上滑落测试

    http://docs.tyflow.com/download/

  10. R语言读入数据库的中英名词互译测试并计分脚本(考试用)

    1. 分子生物学中英文.csv,输入文件,两列,以tab键分隔的txt文本,没有列名 2. 错误的名解.csv, 如果在测试中拼写错误,会写出到这个文件,可用这个容易犯错的名词进行新的测试 3. 注意 ...