描述C#异步Socket

开发 后端
本文介绍C#异步Socket,具体实现和测试时笔者还发现,在Internet环境下的Socket应用中,需要系统有极强的容错能力。

几天前在博问中看到一个C#异步Socket问题,就想到笔者2004年做的一个省级交通流量接收服务器项目,当时的基本求如下:

接收自动观测设备通过无线网卡、Internet和Socket上报的交通量数据包 全年365*24运行的自动观测设备5分钟上报一次观测数据,每笔记录约2K大小 规划全省将有100个左右的自动观测设备(截止2008年10月还只有30个)
当时,VS2003才发布年多,笔者也是接触C#不久。于是Google了国内国外网,希望找点应用C#解决Socket通信问题的思路和代码。***,找到了两篇帮助***的文章:一篇是国人写的Socket接收器框架,应用了独立的客户端Socket会话(Session)概念,给笔者提供了一个接收服务器的总体框架思路;另一篇是美国人写的,提出了多线程、分段接收数据包的技术方案,描述了多线程、C#异步Socket的许多实现细节,该文坚定了笔者采用多线程和处理异步Socket接收器的技术路线。

具体实现和测试时笔者还发现,在Internet环境下的Socket应用中,需要系统有极强的容错能力:没有办法控制异常,就必须允许它们存在(附加源代码中可以看到,try{}catch{}语句较多)。对此,笔者设计了一个专门的检查和清理线程,完成无效或超时会话的清除和资源释放工作。

依稀记得,国内框架作者的名称空间有ibm,认为是IBM公司职员,通过邮件后才知道其人在深圳。笔者向他请教了几个问题,相互探讨了几个技术关键点。可惜,现在再去找,已经查不到原文和邮件了。只好借此机会,将本文献给这两个素未谋面的技术高人和同行,也盼望拙文或源码能给读者一点有用的启发和帮助。

1、主要技术思路

整个系统由三个核心线程组成,并由.NET线程池统一管理:

侦听客户端连接请求线程:ListenClientRequest(),循环侦听客户端连接请求。如果有,检测该客户端IP,看是否是同一观测设备,然后建立一个客户端TSession对象,并通过异步Socket调用方法BeginReceive()接收数据包、EndReceive()处理数据包 数据包处理线程:HandleDatagrams(),循环检测数据包队列_datagramQueue,完成数据包解析、判断类型、存储等工作 客户端状态检测线程:CheckClientState(),循环检查客户端会话表_sessionTable,判断会话对象是否有效,设置超时会话关闭标志,清楚无效会话对象及释放其资源。

2、主要类简介

系统主要由3个类组成:

TDatagramReceiver(数据包接收服务器):系统的核心进程类,建立Socket连接、处理与存储数据包、清理系统资源,该类提供全部的public属性和方法 TSession(客户端会话):由每个客户端的Socket对象组成,有自己的数据缓冲区,清理线程根据该对象的最近会话时间判断是否超时 TDatagram(数据包类):判断数据包类别、解析数据包

3、关键函数和代码

下面简介核心类TDatagramReceiver的关键实现代码。系统启动

系统启动方法StartReceiver()首先清理资源、创建数据库连接、初始化若干计数值,然后创建服务器端侦听Socket对象,***调用静态方法ThreadPool.QueueUserWorkItem()在线程池中创建3个核心处理线程。以上介绍C#异步Socket

  1. Code  
  2. ///  
  3. ///启动接收器  
  4. ///  
  5. publicboolStartReceiver()  
  6. {  
  7. try  
  8. {  
  9. _stopReceiver=true;  
  10.  
  11. this.Close();  
  12.  
  13. if(!this.ConnectDatabase())returnfalse;  
  14.  
  15. _clientCount=0;  
  16. _datagramQueueCount=0;  
  17. _datagramCount=0;  
  18. _errorDatagramCount=0;  
  19. _exceptionCount=0;  
  20.  
  21. _sessionTable=newHashtable(_maxAllowClientCount);  
  22. _datagramQueue=newQueue<TDatagram>(_maxAllowDat) 

【编辑推荐】

  1. C#调用Windows API函数
  2. 详解C#调用Outlook API
  3. C#连接Access、SQL Server数据库
  4. 介绍C#调用API的问题
  5. C#调用Excel与附加代码
责任编辑:佚名 来源: 51CTO.com
相关推荐

2009-08-20 16:33:44

Socket异步通讯

2009-08-13 17:04:09

C#语言C#程序

2009-08-20 09:30:03

C#开发WinForm

2009-08-03 18:08:39

C# ICloneab

2009-08-18 17:41:22

C# ListView

2009-08-17 16:32:34

C# Anonymou

2009-08-31 18:32:01

C# ListBoxE

2009-08-31 13:18:09

C# IWebMess

2009-08-26 17:49:36

C# readonly

2009-08-19 10:09:21

C#和C++

2009-08-27 17:14:36

C# Socket

2009-08-18 16:45:40

C# Raw Sock

2009-09-03 16:55:58

C#引用类型

2009-08-12 18:28:09

C#事件处理程序

2009-09-07 15:31:49

C#支持事件

2009-08-27 10:01:52

C#自动属性

2009-09-07 13:02:52

Java和C#线程

2009-08-21 15:27:11

C# DataGrid

2009-08-06 15:52:11

C#调用外部进程

2009-08-20 16:45:03

C#哈希值
点赞
收藏

51CTO技术栈公众号