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

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 yangjundeng 的 blog

//////////////////////////////////////////////////////////////////////////////////////////
/*

标题:在c#中使用异步socket编程实现tcp网络服务的c/s的通讯构架(一)----基础类库部分

当看到.net中tcplistener和tcpclient的时候,我非常高兴,那就是我想要的通讯模式
但是使用之后发现它们的力量太单薄了,我们需要一个更好的类库来替代它们.

下面提供了一些类,可以很好的完成tcp的c/s通讯模式.在本文的第二部分,我将为大家介绍怎么使用它们

主要通过事件来现实整个的功能:
服务器的事件包括:

服务器满
新客户端连接
客户端关闭
接收到数据
    
客户端使用的事件包括:

已连接服务器
接收到数据
连接关闭

另外为了灵活的处理需求变化,还提供了编码器和报文解析器的实现方法.
注意:该类库没有经过严格的测试,如出现bug,请发送给我,我会觉得你的整个行为是对我的鼓励和支持.

*/
//////////////////////////////////////////////////////////////////////////////////////////

/// <summary>
/// (c)2003-2005 c2217 studio
/// 保留所有权利
///
/// 文件名称:  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类型
///     
/// </summary>

using system;
using system.net.sockets;
using system.net;
using system.text;
using system.diagnostics;
using system.collections;

namespace ibms.net.tcpcsframework
{

 /// <summary>
 /// 网络通讯事件模型委托
 /// </summary>
 public delegate void netevent(object sender, neteventargs e);
 
 /// <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# native code,将来出于效率的考虑可以将c++代码写成的32位dll来代替
 /// c#核心代码, 但这样做缺乏可移植性,而且是unsafe代码(该类的c++代码也存在)
 /// 6.可以限制服务器的最大登陆客户端数目
 /// 7.比使用tcplistener提供更加精细的控制和更加强大异步数据传输的功能,可作为
 /// tcplistener的替代类
 /// 8.使用异步通讯模式,完全不用担心通讯阻塞和线程问题,无须考虑通讯的细节
 ///
 /// 注意:
 /// 1.部分的代码由rational xde生成,可能与编码规范不符
 ///
 /// 原理:
 ///
 ///
 /// 使用用法:
 ///
 /// 例子:
 ///
 /// </summary>
 public class tcpsvr
 {
  #region 定义字段
  
  /// <summary>
  /// 默认的服务器最大连接客户端端数据
  /// </summary>
  public const int defaultmaxclient=100;

  /// <summary>
  /// 接收数据缓冲区大小64k
  /// </summary>
  public const int defaultbuffersize = 64*1024;

  /// <summary>
  /// 最大数据报文大小
  /// </summary>
  public const int maxdatagramsize = 640*1024;

  /// <summary>
  /// 报文解析器
  /// </summary>
  private datagramresolver _resolver;

本文关键:在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top