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

守护线程

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

namespace SocketAsyncSvr
{
class DaemonThread : Object
{
private Thread m_thread;
private AsyncSocketServer m_asyncSocketServer; public DaemonThread(AsyncSocketServer asyncSocketServer)
{
m_asyncSocketServer = asyncSocketServer;
m_thread = new Thread(DaemonThreadStart);
m_thread.Start();
} public void DaemonThreadStart()
{
while (m_thread.IsAlive)
{
AsyncSocketUserToken[] userTokenArray = null;
m_asyncSocketServer.AsyncSocketUserTokenList.CopyList(ref userTokenArray);
for (int i = 0; i < userTokenArray.Length; i++)
{
if (!m_thread.IsAlive)
break;
try
{
if ((DateTime.Now - userTokenArray[i].ActiveDateTime).Milliseconds > m_asyncSocketServer.SocketTimeOutMS) //超时Socket断开
{
lock (userTokenArray[i])
{
m_asyncSocketServer.CloseClientSocket(userTokenArray[i]);
}
}
}
catch (Exception E)
{
Program.Logger.ErrorFormat("Daemon thread check timeout socket error, message: {0}", E.Message);
Program.Logger.Error(E.StackTrace);
}
} for (int i = 0; i < 60 * 1000 / 10; i++) //每分钟检测一次
{
if (!m_thread.IsAlive)
break;
Thread.Sleep(10);
}
}
} public void Close()
{
m_thread.Abort();
m_thread.Join();
}
}
}

心跳包

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

        public bool DoActive()
{
m_outgoingDataAssembler.AddSuccess();
return DoSendResult();
}

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

        public override bool ProcessCommand(byte[] buffer, int offset, int count) //处理分完包的数据,子类从这个方法继承
{
ControlSocketCommand command = StrToCommand(m_incomingDataParser.Command);
m_outgoingDataAssembler.Clear();
m_outgoingDataAssembler.AddResponse();
m_outgoingDataAssembler.AddCommand(m_incomingDataParser.Command);
if (!CheckLogined(command)) //检测登录
{
m_outgoingDataAssembler.AddFailure(ProtocolCode.UserHasLogined, "");
return DoSendResult();
}
if (command == ControlSocketCommand.Login)
return DoLogin();
else if (command == ControlSocketCommand.Active)
return DoActive();
else if (command == ControlSocketCommand.GetClients)
return DoGetClients();
else
{
Program.Logger.Error("Unknow command: " + m_incomingDataParser.Command);
return false;
}
}

DEMO下载地址:http://download.csdn.net/detail/sqldebug_fan/7467745

免责声明:此代码只是为了演示C#完成端口编程,仅用于学习和研究,切勿用于商业用途。水平有限,C#也属于初学,错误在所难免,欢迎指正和指导。邮箱地址:fansheng_hx@163.com。

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

  1. C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型

    原文:C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型 线程模型 SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO ...

  2. 转:【Java并发编程】之四:守护线程与线程阻塞的四种情况

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17099981      守护线程   Java中有两类线程:User Thread(用户线 ...

  3. 【Java并发编程】之四:守护线程与线程阻塞的四种情况

    守护线程 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ​ 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程 ...

  4. C#高性能大容量SOCKET并发(转)

    C#高性能大容量SOCKET并发(零):代码结构说明 C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍 C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs ...

  5. 通过gevent实现单线程下的多socket并发

    #通过gevent实现单线程下的多socket并发 服务器 #server side import sys import socket import time import gevent from g ...

  6. *关于TCP长连接,NAT超时,心跳包

    参考: http://www.jianshu.com/p/584707554ed7 1.TCP长连接 TCP连接建立后只要不明确关闭,逻辑上连接一直存在. TCP是有保活定时器的,可以打开保活定时器来 ...

  7. C#高性能大容量SOCKET并发(十一):编写上传客户端

    原文:C#高性能大容量SOCKET并发(十一):编写上传客户端 客户端封装整体框架 客户端编程基于阻塞同步模式,只有数据正常发送或接收才返回,如果发生错误则抛出异常,基于TcpClient进行封装,主 ...

  8. C#高性能大容量SOCKET并发(零):代码结构说明

    原文:C#高性能大容量SOCKET并发(零):代码结构说明 C#版完成端口具有以下特点: 连接在线管理(提供在线连接维护,连接会话管理,数据接收,连接断开等相关事件跟踪): 发送数据智能合并(组件会根 ...

  9. C#高性能大容量SOCKET并发(九):断点续传

    原文:C#高性能大容量SOCKET并发(九):断点续传 上传断点续传 断点续传主要是用在上传或下载文件,一般做法是开始上传的时候,服务器返回上次已经上传的大小,如果上传完成,则返回-1:下载开始的时候 ...

随机推荐

  1. .net core 下使用StackExchange的Redis库访问超时解决

    原文:.net core 下使用StackExchange的Redis库访问超时解决 目录 问题:并发稍微多的情况下Redis偶尔返回超时 给出了参考网址? 结论 小备注 引用链接 问题:并发稍微多的 ...

  2. 高并发測试工具webbench

    1.简单介绍 webbench最多能够模拟3万个并发连接去測试server的负载能力.编译和配置简单,仅基于TCP协议上对server进行測试. Webbench也是开放源代码.从代码上看,每一个cl ...

  3. sqlserver中的存储过程 函数 事物 索引及视图

                                           存储过程和函数具体的区别: 核心提示:本质上没区别.只是函数有限制只能返回一个标量,而存储过程可以返回多个.并且函数是可以 ...

  4. C#编写TensorFlow人工智能应用

    C#编写TensorFlow人工智能应用 TensorFlowSharp入门使用C#编写TensorFlow人工智能应用学习. TensorFlow简单介绍 TensorFlow 是谷歌的第二代机器学 ...

  5. sparksql hive作为数据源

    根据官方文档的说法,要把hive-site.xml,core-site.xml,hdfs-site.xml拷贝到spark的conf目录下,保证mysql已经启动 java public class ...

  6. TensorFlow 实战(二)—— tf.train(优化算法)

    Training | TensorFlow tf 下以大写字母开头的含义为名词的一般表示一个类(class) 1. 优化器(optimizer) 优化器的基类(Optimizer base class ...

  7. Android之消息推送实现

    在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...

  8. wpf设置设计时的ViewModel

    原文:wpf设置设计时的ViewModel wpf mvvm开发中,有些情况下,你的view不一定设置DataContext,但是你又想在设计阶段,能够自动提示你的view绑定的viewmodel的内 ...

  9. 停止学习Wireshark

    下载和安装好Wireshark之后,启动Wireshark而且在接口列表中选择接口名,然后開始在此接口上抓包.比如.假设想要在无线网络上抓取流量,点击无线接口.点击Capture Options能够配 ...

  10. atitit.提高开发效率---mda 革命性的软件开发方法

    atitit.提高开发效率---mda 革命性的软件开发方法 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和事实上现相分离 2 3. 眼下的问题模型和代码不同步 2 4.  ...