概述
在一些系统中,经常用到客户端和服务器之间的通信,服务器要时刻知道客户端的网络连接状态,这大概就是所谓的“心跳包”。
下面是客户端心跳包核心代码:
# region
++++++++++++++++++++
客户端的感觉系统
// 启动记时器
public void BeginTheTimer()
{
// th_UserLogin();
// 这里只是要一个object类型数据,用它做为下面Timer的参数之一,没有其它意思
object myobject = ( object ) 7 ;
// 暂时设定为1秒钟启动一次!
System.Threading.Timer t = new System.Threading.Timer
( new System.Threading.TimerCallback(testTheNet), myobject, 1000 , 1000 );
}
// 启动监视"已登录用户通信情况"的线程
public void testTheNet( object myobject)
{
// UserPassport up=new UserPassport();
Thread sendMyPulseThPro = new Thread( new ThreadStart(delegateSendMyPulse));
sendMyPulseThPro.Start();
}
/// <summary>
/// 每隔1秒就是要来做这些事情的
/// </summary>
public void delegateSendMyPulse()
{
loginServer lser = new loginServer();
Login l = new Login();
l.Id = lser.MyLogin.Id;
l.ClientTypeVersion = version;
l.RequestType = 3 ;
// 3是确认联接正常的一个信号(让服务知道它与服务器的联接是正常的)
loginServer lserver = new loginServer();
// 启动一个新线程去发送数据
Thread thSendDat2 = new Thread
( new ParameterizedThreadStart(lserver.delgSendDataMethod));
thSendDat2.Start(l);
thSendDat2.IsBackground = true ;
// 标记我已经发送出去一次数据了
longinserver.MyLostTime += 1 ;
// 如果外发了3次请求暗号后仍不见服务器的回应,则认为客户端已经与服务器断开联系了
if (longinserver.MyLostTime >= 3 )
{
// 停止Timer
// 告诉用户:“你已经与服务器失去联系了…………”
longinserver.Controls[ " txtShowMsg " ].Text = " You have lost the connect! " ;
}
}
# endregion +++++++++++++++++++++ 客户端的感觉系统
// 启动记时器
public void BeginTheTimer()
{
// th_UserLogin();
// 这里只是要一个object类型数据,用它做为下面Timer的参数之一,没有其它意思
object myobject = ( object ) 7 ;
// 暂时设定为1秒钟启动一次!
System.Threading.Timer t = new System.Threading.Timer
( new System.Threading.TimerCallback(testTheNet), myobject, 1000 , 1000 );
}
// 启动监视"已登录用户通信情况"的线程
public void testTheNet( object myobject)
{
// UserPassport up=new UserPassport();
Thread sendMyPulseThPro = new Thread( new ThreadStart(delegateSendMyPulse));
sendMyPulseThPro.Start();
}
/// <summary>
/// 每隔1秒就是要来做这些事情的
/// </summary>
public void delegateSendMyPulse()
{
loginServer lser = new loginServer();
Login l = new Login();
l.Id = lser.MyLogin.Id;
l.ClientTypeVersion = version;
l.RequestType = 3 ;
// 3是确认联接正常的一个信号(让服务知道它与服务器的联接是正常的)
loginServer lserver = new loginServer();
// 启动一个新线程去发送数据
Thread thSendDat2 = new Thread
( new ParameterizedThreadStart(lserver.delgSendDataMethod));
thSendDat2.Start(l);
thSendDat2.IsBackground = true ;
// 标记我已经发送出去一次数据了
longinserver.MyLostTime += 1 ;
// 如果外发了3次请求暗号后仍不见服务器的回应,则认为客户端已经与服务器断开联系了
if (longinserver.MyLostTime >= 3 )
{
// 停止Timer
// 告诉用户:“你已经与服务器失去联系了…………”
longinserver.Controls[ " txtShowMsg " ].Text = " You have lost the connect! " ;
}
}
# endregion +++++++++++++++++++++ 客户端的感觉系统
下面是服务器端核心代码如下:
# region
+++++++++++++++++++++++
服务器的感觉系统
// 启动记时器
public void LoadTheTimer()
{
object o = ( object )loginedCount ++ ;
UserPassport up = new UserPassport();
// 暂时设定为1秒钟启动一次!
System.Threading.Timer t = new System.Threading.Timer
( new System.Threading.TimerCallback(watchTheLoginUser), o, 1000 , 1000 );
}
// 启动监视"已登录用户通信情况"的线程
public void watchTheLoginUser( object o)
{
// UserPassport up=new UserPassport();
Thread checktheloginuser = new Thread( new ThreadStart(iAmAWatcher));
checktheloginuser.Start();
}
// 真正做事的工人:这个工人的使命是每隔1秒钟后就查看一下登记薄
// registry里面有谁没有定时来向服务器报到了,如果出现谁三次检查都没有签到则除之名
public void iAmAWatcher()
{
this .txtLogin.Text += " @+ " ;
int index = 0 ;
for (index = 0 ; index < loginedCount; index ++ )
{
if (myRegistry[index].alive == false && registry[index].studentID != "" )
{
lock ( this )
{
// 坏(未到)记录增加一次
myRegistry[index].no_check_in_count += 1 ;
if (myRegistry[index].no_check_in_count >= 3 )
{
// this.lblShowMsg.Text = "the student"
// this.lblShowMsg.Text += registry[index].studentID.ToString()
// this.lblShowMsg.Text += "is diaoxianle!";
this .txtLogin.Text += " 88 " ;
// 标记该人已经与服务器失去连接了,因为他有连续3次的未到记录存在
registry[index].studentID = "" ;
registry[index].StudentName = "" ;
registry[index].StudentIP = "" ;
registry[index].status = 2 ; // 掉线
}
}
}
}
} // 定时检查在线人目前状态
# endregion +++++++++++++++++++ 服务器的感觉系统
// 启动记时器
public void LoadTheTimer()
{
object o = ( object )loginedCount ++ ;
UserPassport up = new UserPassport();
// 暂时设定为1秒钟启动一次!
System.Threading.Timer t = new System.Threading.Timer
( new System.Threading.TimerCallback(watchTheLoginUser), o, 1000 , 1000 );
}
// 启动监视"已登录用户通信情况"的线程
public void watchTheLoginUser( object o)
{
// UserPassport up=new UserPassport();
Thread checktheloginuser = new Thread( new ThreadStart(iAmAWatcher));
checktheloginuser.Start();
}
// 真正做事的工人:这个工人的使命是每隔1秒钟后就查看一下登记薄
// registry里面有谁没有定时来向服务器报到了,如果出现谁三次检查都没有签到则除之名
public void iAmAWatcher()
{
this .txtLogin.Text += " @+ " ;
int index = 0 ;
for (index = 0 ; index < loginedCount; index ++ )
{
if (myRegistry[index].alive == false && registry[index].studentID != "" )
{
lock ( this )
{
// 坏(未到)记录增加一次
myRegistry[index].no_check_in_count += 1 ;
if (myRegistry[index].no_check_in_count >= 3 )
{
// this.lblShowMsg.Text = "the student"
// this.lblShowMsg.Text += registry[index].studentID.ToString()
// this.lblShowMsg.Text += "is diaoxianle!";
this .txtLogin.Text += " 88 " ;
// 标记该人已经与服务器失去连接了,因为他有连续3次的未到记录存在
registry[index].studentID = "" ;
registry[index].StudentName = "" ;
registry[index].StudentIP = "" ;
registry[index].status = 2 ; // 掉线
}
}
}
}
} // 定时检查在线人目前状态
# endregion +++++++++++++++++++ 服务器的感觉系统
来源: http://www.cnblogs.com/hexiaosheng/archive/2008/04/14/xintiaobao.html
最后
以上就是羞涩中心为你收集整理的关于Socket通信服务的心跳包(转)的全部内容,希望文章能够帮你解决关于Socket通信服务的心跳包(转)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复