使用FastTcpServerEx构建服务器

转自:http://www.cnblogs.com/kewei/archive/2013/04/14/3020125.html

前言

本小节是NetworkSocket系列的第6小节,在阅读本小节之前,您可能需要先阅读前面的几个小节,否则可能觉得内容跳转比较大。

描述

FastTcpServerEx是从TcpServerEx派生,使用的协议和TcpServerEx完成相同,FastTcpServerEx充分结合C#强大的反射功能,大大地简化了服务器编程难度,更符合实际通讯项目的编写,与之相比,前两章节提到的TcpServerBase和TcpServerEx构建服务器,离实际项目要求还相差很远。FastTcpServerEx的工作原理是,当收到客户端发来的数据DataEventExArgs后,分析DataEventExArgs的Action参数,把Action和对应的服务方法绑定,把DataEventExArgs.Binary转换为服务方法对应的参数,然后通过反射调用服务方法,将方法的返回值再封装为DataEventExArgs返回给客户端,这里虽然用到了反射,但已经改善和优化过,方便性的提升带来的价值大过于性能的损失价值。

服务器编写思路

你可以把FastTcpServerEx比作Wcf来理解,编写步骤是:1、编写服务契约IDemoServer,当然还有用到的实体,建议实体单独作一个项目工程,这样在序列化工作很方便;2、新增DemoServer类,派生于FastTcpServerEx,并继承IDemoServer接口;3、实现IDemoServer接口

编写接口

新建Server工程,引用NetworkSocket.dll,引入NetworkSocket、NetWorkSocket.TcpExtention、NetWorkSocket.Serialization、Entity命名空间,添加IDemoServer接口

View Code

上面的接口有三个服务方法,分别为客户端登录、客户获取数据相加、获取客户端本机时间,前两个方法都是客户端主动请求,服务器被动处理,而后一个方法是服务器主动请求,客户端被动处理(即服务器和客户端功能倒置)。这里要注意的是,每个方法的第一个参数必须是SocketAsync<DataEventExArgs>,这个参数不是数据参数,不会被序列化然后传送到另一端,而是在方法的实现中会经常用到这个参数。

实现接口

实现接口也就是实现了服务器的功能,这里也就不多篇幅来说明怎么实现接口了。

View Code

当接口实现后,服务器的功能已编写完成,下面是启动服务器的方法

View Code

生成服务调用代理

wcf的时候,我们把服务发布后,通过vs很方便就可以生成服务调用的代理类,FastTcpServerEx也有类似功能,不同的是,这个代理类是通过ProxyMaker工具来反射IDemoServer,获取里面的方法,然后逆向生成调用代码,最终于编译为Server.dll输出,客户端只要引用Server.dll,就可以方便的和服务器通讯了。

运行ProxyMaker

这里对应我们的命令是:ProxyMaker.exe /a ..\Demo\Server\bin\Debug\Server.exe /i IDemoServer ,我们可以把它放到批处理文件,以后双击就可以编译出Server.dll;

编写客户端

有了Server.dll,编写客户端的难度也大大的降低了,新建Client工程,引用NetworkSocke.dll和刚才生成的Server.dll;实例化 DemoServer client = new DemoServer();然后就可以调用里面的方法了,这里和wcf客户端几乎完全一样;由于比较简单,客户端代码中我就不注释了。

View Code

运行效果

 

 
 
分类: NetworkSocket
posted @ 2013-04-17 00:09  ADTL  阅读(636)  评论(0)    收藏  举报