2016-02-19 183 views
4

我有一个nodejs websocket服务器,我有以下问题。nodejs websocket检测断开连接套接字

当我的客户端连接到服务器并优雅地终止时,在这些套接字上调用onclose方法,并对封闭的套接字执行清理操作。

当客户端由于网络而断开时,onclose方法未被调用。是否有超时设置,以便在超时后自动调用onclose

我使用ws包中的NodeJS

回答

12

默认WS实现没有来自客户端的网络断开连接的回调

你可以找到的保持有效实现here

我不知道为什么我的帖子被低估。至少发表评论有什么不对?

2

WebSocket的服务器为了检测断开连接,你需要有一些流量。如果您的应用程序产生持续的流量,那么您可以执行一些操作,例如每次收到某个事件时重置计数器,并在计数器用完时考虑连接失败。

否则,您应该能够使用WebSocket提供的ping。这些不在浏览器中公开,但是用于Node.js的WebSocket库可能允许您打开它们并在ping失败时收到通知。

2

那么我会尽量用两个例子来回答你的问题。尝试分析两者并了解它们的工作方式。他们都经过测试和工作。

1-网页套接字:

服务器:

var WebSocketServer = require('websocket').server; 
var http = require('http'); 

var server = http.createServer(function(request, response) { 
    console.log((new Date()) + ' Received request for ' + request.url); 
    response.writeHead(404); 
    response.end(); 
}); 
server.listen(3000, function() { 
    console.log((new Date()) + ' Server is listening on port 3000'); 
}); 

wsServer = new WebSocketServer({ 
    httpServer: server, 
    autoAcceptConnections: false 
}); 

function originIsAllowed(origin) { 
    return true; 
} 

wsServer.on('request', function(request) { 
    if (!originIsAllowed(request.origin)) { 
     request.reject(); 
     console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); 
     return; 
    } 

    var connection = request.accept('echo-protocol', request.origin); 
    console.log((new Date()) + ' Connection accepted.'); 
    connection.on('message', function(message) { 
     if (message.type === 'utf8') { 
      console.log('Received Message: ' + message.utf8Data); 
      connection.sendUTF(message.utf8Data); 
     } 
     else if (message.type === 'binary') { 
      console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); 
      connection.sendBytes(message.binaryData); 
     } 
    }); 
    connection.on('close', function(reasonCode, description) { 
     console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); 
    }); 
}); 

客户:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Web socket Experiment</title> 
    <script type="text/javascript"> 
     function callWebSocket() { 

      var socket = new WebSocket("ws://localhost:3000", 'echo-protocol'); 

      socket.onopen = function() { 
       alert("Hello, Connected To WS server"); 
      }; 

      socket.onmessage = function (e) { 
       alert("The message received is : " + e.data); 
      }; 
      socket.onerror = function (e) { 
       alert("An error occured while connecting... " + e.data); 
      }; 
      socket.onclose = function() { 
       alert("hello.. The coonection has been clsoed"); 
      }; 

     } 
    </script> 
</head> 

<body> 
    <input type="button" value="Open Connecton" onclick="callWebSocket()" /> 
</body> 
</html> 

2- Socket.io:

服务器:

var http = require('http'); 
    var app = require('express')(); 
    var httpServer = http.createServer(app) 
    var io = require('socket.io')(httpServer); 

app.get('/', function(req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.on('connection', function(socket) { 
    socket.emit('news', { 
     hello: 'world' 
    }); 
    socket.on('my other event', function(data) { 
     console.log(data); 
    }); 
    socket.on('disconnect', function(data) { 
     console.log('disconnect!'); 
    }); 
}); 

httpServer.listen(3000); 

客户:

<html> 
<head> 
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script> 
<script> 
    var conn_options = { 
    'sync disconnect on unload':false 
    }; 
    var socket = io.connect('http://localhost:3000',conn_options); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 
</head> 
<body> 
</body> 
</html> 
+0

我忘了提及我正在使用ws包来自npm的websocket服务器。 https://www.npmjs.com/package/ws。似乎它没有通知断开连接。 –