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


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


# 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  +++++++++++++++++++++  客户端的感觉系统




下面是服务器端核心代码如下:



# 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  +++++++++++++++++++  服务器的感觉系统