在C#中使用异步Socket编程实现TCP网络服务的CS的通讯构架(一)----基础类库部分

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

标题:在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分当看到.NET中TcpListener和TcpClient的时候,我非常高兴,那就是我想要的通讯模式但是使用之后发现它们的力量太单薄了,我们需要一个更好的类库来替代它们.下面提供了一些类,可以很好的完成Tcp的C/S通讯模式.在本文的第二部分,我将为大家介绍怎么使用它们主要通过事件来现实整个的功能:服务器的事件包括:服务器满新客户端连接客户端关闭接收到数据客户端使用的事件包括:已连接服务器接收到数据连接关闭另外为了灵活的处理需求变化,还提供了编码器和报文解析器的实现方法.注意:该类库没有经过严格的测试,如出现Bug,请发送给我,我会觉得你的整个行为是对我的鼓励和支持.*//////////////////////////////////////////////////////////////////////////////////////////////summary///(C)2003-2005C2217Studio///保留所有权利//////文件名称:TcpCSFramework.cs///文件ID:///编程语言:C#///文件说明:提供TCP网络服务的C/S的通讯构架基础类///(使用异步Socket编程实现)//////当前版本:1.1///替换版本:1.0//////作者:邓杨均///EMail:dyj057@gmail.com///创建日期:2005-3-9///最后修改日期:2005-3-17//////历史修改记录://////时间:2005-3-14///修改内容:///1.创建Ibms.Net.TcpCSFramework命名空间和添加Session对象.///2.修改NetEventArgs类,以适应新添加对象.///3.添加了会话退出类型,更适合实际的情况.///注意:///*强制退出类型是应用程序直接结束,比如通过任务管理器结束///程序或者程序异常退出等,没有执行正常的退出方法而产生的.///*正常的退出类型是应用程序执行正常的退出的方法关键在于///需要调用Socket.Shutdown(SocketShutdown.Both)后才调用///Socket.Close()方法,而不是直接的调用Socket.Close()方法,///如果那样调用将产生强制退出类型.//////时间:2005-3-16///修改内容:///1.创建TcpCli,Coder,DatagramResover对象,把抽象和实现部分分离///2.文件版本修改为1.1,1.0版本仍然保留,更名为:///TcpCSFramework_v1.0.cs///3.在TcpServer中修改自定义的hashtable为系统Hashtable类型///////summaryusingSystem;usingSystem.Net.Sockets;usingSystem.Net;usingSystem.Text;usingSystem.Diagnostics;usingSystem.Collections;namespaceIbms.Net.TcpCSFramework{///summary///网络通讯事件模型委托////summarypublicdelegatevoidNetEvent(objectsender,NetEventArgse);///summary///提供TCP连接服务的服务器类//////版本:1.1///替换版本:1.0//////特点:///1.使用hash表保存所有已连接客户端的状态,收到数据时能实现快速查找.每当///有一个新的客户端连接就会产生一个新的会话(Session).该Session代表了客///户端对象.///2.使用异步的Socket事件作为基础,完成网络通讯功能.///3.支持带标记的数据报文格式的识别,以完成大数据报文的传输和适应恶劣的网///络环境.初步规定该类支持的最大数据报文为640K(即一个数据包的大小不能大于///640K,否则服务器程序会自动删除报文数据,认为是非法数据),防止因为数据报文///无限制的增长而倒是服务器崩溃///4.通讯格式默认使用Encoding.Default格式这样就可以和以前32位程序的客户端///通讯.也可以使用U-16和U-8的的通讯方式进行.可以在该DatagramResolver类的///继承类中重载编码和解码函数,自定义加密格式进行通讯.总之确保客户端与服务///器端使用相同的通讯格式///5.使用C#nativecode,将来出于效率的考虑可以将C++代码写成的32位dll来代替///C#核心代码,但这样做缺乏可移植性,而且是Unsafe代码(该类的C++代码也存在)///6.可以限制服务器的最大登陆客户端数目///7.比使用TcpListener提供更加精细的控制和更加强大异步数据传输的功能,可作为///TcpListener的替代类///8.使用异步通讯模式,完全不用担心通讯阻塞和线程问题,无须考虑通讯的细节//////注意:///1.部分的代码由RationalXDE生成,可能与编码规范不符//////原理://///////使用用法://////例子:///////summarypublicclassTcpSvr{#region定义字段///summary///默认的服务器最大连接客户端端数据////summarypublicconstintDefaultMaxClient=100;///summary///接收数据缓冲区大小64K////summarypublicconstintDefaultBufferSize=64*1024;///summary///最大数据报文大小////summarypublicconstintMaxDatagramSize=640*1024;///summary///报文解析器////summaryprivateDatagramResolver_resolver;///summary///通讯格式编码解码器////summaryprivateCoder_coder;///summary///服务器程序使用的端口////summaryprivateushort_port;///summary///服务器程序允许的最大客户端连接数////summaryprivateushort_maxClient;///summary///服务器的运行状态////summaryprivatebool_isRun;///summary///接收数据缓冲区////summaryprivatebyte[]_recvDataBuffer;///summary///服务器使用的异步Socket类,////summaryprivateSocket_svrSock;///summary///保存所有客户端会话的哈希表////summaryprivateHashtable_sessionTable;///summary///当前的连接的客户端数////summaryprivateushort_clientCount;#endregion#region事件定义///summary///客户端建立连接事件////summarypubliceventNetEventClientConn;///summary///客户端关闭事件////summarypubliceventNetEventClientClose;///summary///服务器已经满事件////summarypubliceventNetEventServerFull;///summary///服务器接收到数据事件////summarypubliceventNetEventRecvData;#endregion#region构造函数///summary///构造函数////summary///paramname=port服务器端监听的端口号/param///paramname=maxClient服务器能容纳客户端的最大能力/param///paramname=encodingMothord通讯的编码方式/parampublicTcpSvr(ushortport,ushortmaxClient,Codercoder){_port=port;_maxClient=maxClient;_coder=coder;}///summary///构造函数(默认使用Default编码方式)////summary///paramname=port服务器端监听的端口号/param///paramname=maxClient服务器能容纳客户端的最大能力/parampublicTcpSvr(ushortport,ushortmaxClient){_port=port;_maxClient=maxClient;_coder=newCoder(Coder.EncodingMothord.Default);}//summary///构造函数(默认使用Default编码方式和DefaultMaxClient(100)个客户端的容量)////summary///paramname=port服务器端监听的端口号/parampublicTcpSvr(ushortport):this(port,DefaultMaxClient){}#endregion#region属性///summary///服务器的Socket对象////summarypublicSocketServerSocket{get{return_svrSock;}}///summary///数据报文分析器////summarypublicDatagramResolverResovlver{get{return_resolver;}set{_resolver=value;}}///summary///客户端会话数组,保存所有的客户端,不允许对该数组的内容进行修改////summarypublicHashtableSessionTable{get{return_sessionTable;}}///summary///服务器可以容纳客户端的最大能力////summarypublicintCapacity{get{return_maxClient;}}///summary///当前的客户端连接数////summarypublicintSessionCount{get{return_clientCount;}}///summary///服务器运行状态////summarypublicboolIsRun{get{return_isRun;}}#endregion#region公有方法///summary///启动服务器程序,开始监听客户端请求////summarypublicvirtualvoidStart(){if(_isRun){throw(newApplicationException(TcpSvr已经在运行.));}_sessionTable=newHashtable(53);_recvDataBuffer=newbyte[DefaultBufferSize];//初始化socket_svrSock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//绑定端口IPEndPointiep=newIPEndPoint(IPAddress.Any,_port);_svrSock.Bind

1 / 36
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功