C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包

本文主要是介绍C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/SQLDebug_Fan/article/details/20465195


守护线程

在服务端版Socket编程需要处理长时间没有发送数据的Socket,需要在超时多长时间后断开连接,我们需要独立一个线程(DaemonThread)来轮询,在执行断开时,需要把Socket对象锁定,并调用CloseClientSocket来断开连接,具体处理代码如下:

[csharp]  view plain  copy
  1. namespace SocketAsyncSvr  
  2. {  
  3.     class DaemonThread : Object  
  4.     {  
  5.         private Thread m_thread;  
  6.         private AsyncSocketServer m_asyncSocketServer;  
  7.   
  8.         public DaemonThread(AsyncSocketServer asyncSocketServer)  
  9.         {  
  10.             m_asyncSocketServer = asyncSocketServer;  
  11.             m_thread = new Thread(DaemonThreadStart);  
  12.             m_thread.Start();  
  13.         }  
  14.   
  15.         public void DaemonThreadStart()  
  16.         {  
  17.             while (m_thread.IsAlive)  
  18.             {  
  19.                 AsyncSocketUserToken[] userTokenArray = null;  
  20.                 m_asyncSocketServer.AsyncSocketUserTokenList.CopyList(ref userTokenArray);  
  21.                 for (int i = 0; i < userTokenArray.Length; i++)  
  22.                 {  
  23.                     if (!m_thread.IsAlive)  
  24.                         break;  
  25.                     try  
  26.                     {  
  27.                         if ((DateTime.Now - userTokenArray[i].ActiveDateTime).Milliseconds > m_asyncSocketServer.SocketTimeOutMS) //超时Socket断开  
  28.                         {  
  29.                             lock (userTokenArray[i])  
  30.                             {  
  31.                                 m_asyncSocketServer.CloseClientSocket(userTokenArray[i]);  
  32.                             }  
  33.                         }  
  34.                     }                      
  35.                     catch (Exception E)  
  36.                     {  
  37.                         Program.Logger.ErrorFormat("Daemon thread check timeout socket error, message: {0}", E.Message);  
  38.                         Program.Logger.Error(E.StackTrace);  
  39.                     }  
  40.                 }  
  41.   
  42.                 for (int i = 0; i < 60 * 1000 / 10; i++) //每分钟检测一次  
  43.                 {  
  44.                     if (!m_thread.IsAlive)  
  45.                         break;  
  46.                     Thread.Sleep(10);  
  47.                 }  
  48.             }  
  49.         }  
  50.   
  51.         public void Close()  
  52.         {  
  53.             m_thread.Abort();  
  54.             m_thread.Join();  
  55.         }  
  56.     }  
  57. }  

心跳包

有超时连接,相对应的需要设计心跳包,心跳包用来检测连接和维护连接状态,心跳包的原理是客户端发送一个包给服务器,服务器收到后发一个响应包给客户端,通过检测是否有返回来判断连接是否正常,心跳包实现放在BaseSocketProtocol.DoActive方法中。

[csharp]  view plain  copy
  1. public bool DoActive()  
  2. {  
  3.     m_outgoingDataAssembler.AddSuccess();  
  4.     return DoSendResult();  
  5. }  

具体由各个协议是否决定调用,如控制协议ControlSocketProtocol实现心跳协议如下:

[csharp]  view plain  copy
  1. public override bool ProcessCommand(byte[] buffer, int offset, int count) //处理分完包的数据,子类从这个方法继承  
  2. {  
  3.     ControlSocketCommand command = StrToCommand(m_incomingDataParser.Command);  
  4.     m_outgoingDataAssembler.Clear();  
  5.     m_outgoingDataAssembler.AddResponse();  
  6.     m_outgoingDataAssembler.AddCommand(m_incomingDataParser.Command);  
  7.     if (!CheckLogined(command)) //检测登录  
  8.     {  
  9.         m_outgoingDataAssembler.AddFailure(ProtocolCode.UserHasLogined, "");  
  10.         return DoSendResult();  
  11.     }  
  12.     if (command == ControlSocketCommand.Login)  
  13.         return DoLogin();  
  14.     else if (command == ControlSocketCommand.Active)  
  15.         return DoActive();  
  16.     else if (command == ControlSocketCommand.GetClients)  
  17.         return DoGetClients();  
  18.     else  
  19.     {  
  20.         Program.Logger.Error("Unknow command: " + m_incomingDataParser.Command);  
  21.         return false;  
  22.     }  
  23. }  
DEMO下载地址: http://download.csdn.net/detail/sqldebug_fan/7467745
免责声明:此代码只是为了演示C#完成端口编程,仅用于学习和研究,切勿用于商业用途。水平有限,C#也属于初学,错误在所难免,欢迎指正和指导。邮箱地址:fansheng_hx@163.com。

这篇关于C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/319930

相关文章

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流