资源下载 | 发布源码资源
源码下载:Delphi源码 | JAVA源码 | VC源码 | VB源码 | .NET源码 | PB源码 | PHP源码

会员中心

当前位置:问友源码 ->
相关分类

在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
发 布 者:tomore 
发布日期:2006-08-31 11:59
资源类别:
所属子类:
开发语言:其他开发语言
相关标签:使用 异步 socket 编程 实现 tcp 网络 服务 通讯 构架 基础 类库 部分 

详细描述:
  //////////////////////////////////////////////////////////////////////////////////////////
/*

标题:在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 = por
相关下载资源:
该聊天程序包括服务器和客户端两部分,使用是MFC的CSOCKET类。它可以使多个人聊天,其工作方式类似于网上聊
该聊天程序包括服务器和客户端两部分,使用是MFC的CSOCKET类。它可以使多个人聊天,其工作方式类似于网上聊天室 ...
一个利用TCP/IP实现Chat功能的程序(服务器端程序)(25KB)
一个利用TCP/IP实现Chat功能的程序(服务器端程序)(25KB)
用套接口实现UDP协议的网络通信
用套接口实现UDP协议的网络通信 套接字是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看做不同 ...
深入 CSocket 编程之阻塞和非阻塞模式
适合初中级读者阅读 有时,花上几个小时阅读、调试、跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓 ...
异步 SOCKET 编程 - 发送和接收数据
原作者: DREW SIKORA 我本想把发送和接收分开作为两部分,但是最后我决定只略微解释一下 FD_READ ,留下更多 ...
Socket 编程简介
《Linux 公报》……让Linux更富魅力!&nbsp; Socket 编程简介 作者:Pedro Paulo Ferreira Bueno 和 Antoni ...

会员评论:[举报获金币] 更多评论>>

还没有会员发布评论

发表评论:
hmtttank:上传资源被加精,获得10金币
gaoli0829sheng:上传资源被加精,获得10金币
panyuanol:上传资源被加精,获得10金币
hjianhuo:上传资源被加精,获得10金币
hjianhuo:上传资源被加精,获得10金币
dengdengwang:上传资源被加精,获得10金币
小叶子月:上传资源被加精,获得10金币
he426100:上传资源被加精,获得10金币
skyandecho:上传资源被加精,获得10金币
linjh225569:上传资源被加精,获得10金币

[完成后可按 Ctrl+Enter 发布]