在新版本的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. Mybatis源码分析(原创)

    @test 1.进入SqlSessionFactoryBuilder中build方法 2.进入XMLConfigBuilder类中parse->parseConfiguration中  通过该方 ...

  2. meta标签整合

    <title>名称</title>(便于搜索) <meta name="keywords" content="内容"> ke ...

  3. php获取微信基础接口凭证Access_token

    php获取微信基础接口凭证Access_token的具体代码,供大家参考,具体内容如下 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进 ...

  4. 在IDEA中spring程序可以正常运行,但IDE报错Could not autowire.

    这个问题只会在使用xml文件配置bean时遇到,使用自动配置和java配置没有这种错误. 遇到这个问题首先要确定配置文件已经正确的放在了resources文件夹内,resources文件夹就是clas ...

  5. JS获取键盘事件

    <script type="text/javascript" language=JavaScript charset="UTF-8"> docume ...

  6. SpringBoot报错:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone

    解决方法: 在数据库连接url配置后边加&serverTimezone=GMT%2B8 例: jdbc:mysql://127.0.0.1:3306/test改为jdbc:mysql://12 ...

  7. Java内存模型锦集

    [内存操作与内存屏障] 内存模型操作: lock(锁定) : 作用与主内存的变量, 它把一个变量标识为一条线程独占的状态 unlock(解锁) : 作用于主内存变量, 它把一个处于锁定状态的变量释放出 ...

  8. CannyLab/tsne-cuda with cuda-10.0

    t-SNE-CUDA Barnes-Hut t-SNE https://github.com/CannyLab/tsne-cuda/projects 做数据降维时常用到,但计算较慢,所以可用cuda加 ...

  9. 构建一个 预装 pm2 的 node 项目 docker 底包

    Dockerfile: 创建 dockerfile 文件, 命名为 dockerfile-yourProject-node.8.12.0-pm2 # MAGE: yourGroup/yourProje ...

  10. [Swift]LeetCode10. 正则表达式匹配 | Regular Expression Matching

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...