【问题标题】:Websocket reconnect after page refresh页面刷新后Websocket重新连接
【发布时间】:2019-08-05 21:56:19
【问题描述】:

我将websocket 与用于 Node.js SPA 的 http 服务器结合使用。我对 websocket 的使用是从服务器读取索引文件并将其推送到客户端。除非我刷新页面,否则 websocket 正在工作。

有人可以帮助我重新连接 websocket 吗? 我正在监听 onClose 事件并调用创建 websocket 的方法。刷新页面后出现的错误是:

Socket encountered error:  write after end Closing socket

/home/pi/data_collector_access_point/node_modules/ws/lib/websocket.js:829
websocket.readyState = WebSocket.CLOSING;
                       ^

TypeError: Cannot set property 'readyState' of undefined
    at Socket.socketOnClose (/home/pi/data_collector_access_point/node_modules/ws/lib/websocket.js:829:24)
    at emitOne (events.js:121:20)
    at Socket.emit (events.js:211:7)
    at TCP._handle.close [as _onclose] (net.js:567:12)

服务器.js

serverWS(address){
        let server = address
        const WebSocket = require('ws');
        let wss = new WebSocket.Server({ server });
        var socketstate = 1;
        wss.on('connection', function connection(ws, req) {

            ws.on('message', function incoming(message) {
            });

            ws.onclose = function(){
                socketstate = 0
                console.log('ws.onclose()')
                setTimeout(function(){
                    console.log('reconnct ', server)
                    let fti_server = new create_server()
                    fti_server.serverWS(server)
                },3000);
            };

             ws.onerror = function(err) {
                console.error('Socket encountered error: ', err.message, 'Closing socket');
                ws.close();
             };

            function sendme(data){
                switch(socketstate){
                    case 0:
                        console.log('sendme() socket state', socketstate)
                        break;
                    case 1:
                        console.log('sendme() socket state', socketstate)
                        if(ws.readyState == 1){
                            updater((data)=>{
                                ws.send(data)   
                            })
                        }
                        break;
                }


            }

            function reOpen(){
                console.log('reopen', wss)
                wss = new WebSocket.Server({ server });
            }

            setInterval(()=>{
                switch(ws.readyState){
                    case 1 :
                        console.log('switch case ws state on')
                            sendme(data)
                        break;
                    case 2 :
                        console.log('ws state 2')
                        break
                    case 3 :
                        console.log('switch case ws state not on')
                        break;

                }
            },1000); 
        })

    }

我正在监听 websocketReadystate 以查看 websocket 是否打开、关闭、关闭等。一旦打开,我将继续发送索引数据。

我引用了这个reconnection situation

【问题讨论】:

    标签: node.js websocket


    【解决方案1】:

    对于那些感兴趣的人,我通过允许浏览器建立连接而无需再次调用 websocket 设置函数来使其工作。我修改了onclose(),它可以工作了!

    ws.onclose = function(){
                    socketstate = 0
                    ws.close()
                };
    

    【讨论】:

      猜你喜欢
      • 2019-07-27
      • 2014-05-06
      • 1970-01-01
      • 2012-03-26
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      相关资源
      最近更新 更多