websocket 服务端如何感知到客户端的断网
2018-01-16 17:10
239 查看
最近在做一个用到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,就判定断网。其实就是定时任务开启,不断扫描最后一次发送时间和现在时间的差值,时间太长的话,那就是断了,而不是每次都主动向客户端发信息。
这个问题就解决了!
服务端要监控客户端遇到一个很让人为难的要求就是“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,就判定断网。其实就是定时任务开启,不断扫描最后一次发送时间和现在时间的差值,时间太长的话,那就是断了,而不是每次都主动向客户端发信息。
这个问题就解决了!
相关文章推荐
- websocket java使用demo。包含客户端与服务端使用
- 如何排查APP服务端和客户端是否支持ATS
- C# SuperWebSocket服务端、客户端学习(三)
- 在servlet开发时,如何减小客户端对服务端的频繁访问
- spring websocket stomp如何向服务端传递参数
- 如何让服务端同时支持WebSocket和SSL加密的WebSocket(即同时支持ws和wss)?
- QT TCP服务端如何判断客户端已断开连接
- Android客户端和服务端如何使用Token和Session
- linux下如何同时运行服务端和客户端程序
- websocket java服务端、html5客户端以及java客户端
- ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
- 客户端如何更具需要连接不同的服务端
- WebSocket集成XMPP网页即时通讯1:Java Web Project服务端/客户端Jetty9开发初探
- tcp 服务端如何判断客户端断开连接
- ASP.NET如何在客户端调用服务端代码
- 如何创建一个客户端回调:js获得服务端的内容?
- WebSocket服务端主动向客户端推送数据在项目的实际使用
- Mysql 客户端查询结果如何保存到本地而不是服务端?
- ASP.NET MVC系列之 如何实现自定义验证(服务端验证+客户端验证)
- 在WebGrid中,客户端新增行后,如何在服务端引发行更新事件