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