关于Socket通信服务的心跳包
在一些系统中,经常用到客户端和服务器之间的通信,服务器要时刻知道客户端的网络连接状态,这大概就是所谓的“心跳包”。
下面是客户端心跳包核心代码:
# 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&®istry[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 +++++++++++++++++++ 服务器的感觉系统
浙公网安备 33010602011771号