最近在做一个用到websocket的项目,大体是这样:服务端用的是java开发的web服务,客户端是机床,机床端跑的是用C#技术编写的exe程序,在exe程序中,会有ws连接web服务端,从而web端能监控机床端的状态。(这里并没有涉及到页面js中使用websocket)
服务端要监控客户端遇到一个很让人为难的要求就是“web服务端需要能够感知到客户端的联网和断网状态,进而在后台操作后台数据库”,查过很多资料,websocket端无法感知客户端的连接情况,那么我使用了第一种方式:服务端定时发信息给客户端,如果发不过去,触发onError的方法,那么就在onError中做进一步操作。可是这种方法在线上运行以后很快得到了否定,服务端用的是
public void checkClientLiving(final String cncId){
Runnable runnable = new Runnable() {
public void run() {
while (true) {
// ------- code for task to run
try {
...//具体要做什么
} catch (IOException e1) {
e1.printStackTrace();
}
// ------- ends here
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(runnable);
thread.start();
}
不断的新起来一个线程,增加了服务端的压力,如果哪一个线程出现错误,客户端就算是有重连机制,也连不上了,这样就像一团乱麻。
于是采用了方法二:客户端每10s(举个例子)向服务器端发一个信息,服务端将发这个数据的信息和保存时间存入表中,随后应用用定时任务不断的检查当前时间和刚刚存入的时间的差值:这里用到了这个函数TIMESTAMPDIFF(SECOND, dataEnterTime,now()),如果这个值大于20s,就判定断网。其实就是定时任务开启,不断扫描最后一次发送时间和现在时间的差值,时间太长的话,那就是断了,而不是每次都主动向客户端发信息。
这个问题就解决了!