[转]C#.net同步异步SOCKET通讯和多线程总结

这是一个关于C#.net中使用异步Socket编程实现TCP服务器和客户端通讯的详细教程,包括基础类库的设计,事件驱动的通信模型,以及如何处理并发连接和数据传输。文章涵盖了服务器满、新客户端连接、客户端关闭和接收数据等关键事件,并提供了报文解析器和编码器的实现方法,以适应不同的数据格式和传输需求。
摘要由CSDN通过智能技术生成

//

//http://www.cnblogs.com/llcto/archive/2009/10/15/1583663.html
  /*
  标题:在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;
   /// <summary>
   /// 通讯格式编码解码器
   /// </summary>
   private Coder _coder;
   /// <summary>
   /// 服务器程序使用的端口
   /// </summary>
   private ushort _port;
   /// <summary>
   /// 服务器程序允许的最大客户端连接数
   /// </summary>
   private ushort _maxClient;
   /// <summary>
   /// 服务器的运行状态
   /// </summary>
   private bool _isRun;
   /// <summary>
   /// 接收数据缓冲区
   /// </summary>
   private byte[] _recvDataBuffer;
   /// <summary>
   /// 服务器使用的异步Socket类,
   /// </summary>
   private Socket _svrSock;
   /// <summary>
   /// 保存所有客户端会话的哈希表
   /// </summary>
   private Hashtable _sessionTable;
   /// <summary>
   /// 当前的连接的客户端数
   /// </summary>
   private ushort _clientCount;
   #endregion
   #region 事件定义
   
   /// <summary>
   /// 客户端建立连接事件
   /// </summary>
   public event NetEvent ClientConn;
   /// <summary>
   /// 客户端关闭事件
   /// </summary>
   public event NetEvent ClientClose;
   /// <summary>
   /// 服务器已经满事件
   /// </summary>
   public event NetEvent ServerFull;
   /// <summary>
   /// 服务器接收到数据事件
   /// </summary>
   public event NetEvent RecvData;
   #endregion
   
   #region 构造函数
   /// <summary>
   /// 构造函数
   /// </summary>
   /// <param name="port">服务器端监听的端口号</param>
   /// <param name="maxClient">服务器能容纳客户端的最大能力</param>
   /// <param name="encodingMothord">通讯的编码方式</param>
   public TcpSvr( ushort port,ushort maxClient, Coder coder)
   {
   _port = port;
   _maxClient = maxClient;
   _coder = coder;
   }
   /// <summary>
   /// 构造函数(默认使用Default编码方式)
   /// </summary>
   /// <param name="port">服务器端监听的端口号</param>
   /// <param name="maxClient">服务器能容纳客户端的最大能力</param>
   public TcpSvr( ushort port,ushort maxClient)
   {
   _port = port;
   _maxClient = maxClient; 
   _coder = new Coder(Coder.EncodingMothord.Default);
   }
   
   // <summary>
   /// 构造函数(默认使用Default编码方式和DefaultMaxClient(100)个客户端的容量)
   /// </summary>
   /// <param name="port">服务器端监听的端口号</param>
   public TcpSvr( ushort port):this( port, DefaultMaxClient)
   {
   }
   #endregion
   #region 属性
   /// <summary>
   /// 服务器的Socket对象
   /// </summary>
   public Socket ServerSocket
   {
   get
   {
   return _svrSock;
   }
   }
   /// <summary>
   /// 数据报文分析器
   /// </summary>
   public DatagramResolver Resovlver
   {
   get
   {
   return _resolver;
   }
   set
   {
   _resolver = value;
   }
   }
   /// <summary>
   /// 客户端会话数组,保存所有的客户端,不允许对该数组的内容进行修改
   /// </summary>
   public Hashtable SessionTable 
   {
   get 
   {
   return _sessionTable;
   }
   }
   /// <summary>
   /// 服务器可以容纳客户端的最大能力
   /// </summary>
  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值