您的位置:首页 > 其它

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,就判定断网。其实就是定时任务开启,不断扫描最后一次发送时间和现在时间的差值,时间太长的话,那就是断了,而不是每次都主动向客户端发信息。

这个问题就解决了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  websocket 服务端 断网