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

相关文章

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

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

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