关于Socket通信服务的心跳包(转)

来源:互联网 发布:qq炫舞一键开黑软件 编辑:程序博客网 时间:2024/04/29 02:57

在一些系统中,经常用到客户端和服务器之间的通信,服务器要时刻知道客户端的网络连接状态,这大概就是所谓的“心跳包”。

下面是客户端心跳包核心代码:

# 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, 10001000);
        }

        
//启动监视"已登录用户通信情况"的线程
        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, 10001000);            
                   }

        
//启动监视"已登录用户通信情况"的线程
        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 +++++++++++++++++++ 服务器的感觉系统