Socket.io-关于套接字断开

时间:2017-03-07 02:55:15

标签: javascript node.js html5 socket.io

我在socket.io中有这个场景:

我想从服务器接收数据并将数据转发到webclient.But当我收到大量数据并关闭页面时,它控制台

var express=require('express');
var app=express();
var net=require('net');
var http=require('http').createServer(app);
var io=require('socket.io')(http);
var net=require('net');
var nodeServer = new net.Socket();
var aSocket=null;

io.on('connection', function (socketIO) {
  aSocket=socketIO;
};
nodeServer.on('data', function(data) {
 if(aSocket!=null){
    aSocket.emit('pushToWebClient',useData);
    aSocket.on('disconnect', function () {
      console.log('DISCONNECTED FROM CLIENT');
    });

  }

以下是代码:

服务器:

socket.on('pushToWebClient', function (useData) {


    });

客户端:

aSocket.on('disconnect', function () {
          console.log('DISCONNECTED FROM CLIENT');
        });

我找到了

<script>
    $(function() {
        var viewerElement = document.getElementById("viewer");
        var myWebViewer = new PDFTron.WebViewer({
            path: "/libs",
            type: "html5",
            documentType:'xod',
            initialDoc:"https://brucechen.blob.core.windows.net/docs/GettingStarted.xod"
        }, viewerElement);
    });
</script>

控制了很多“从客户端断开连接”,但实际上它应该在代码中只控制一次。

我甚至有console.log(aSocket.id),它只控制一个。

我不知道为什么这么多次是控制台。

我已经使用setMaxListeners(10)来试图避免它。 它会导致内存泄漏吗?

4 个答案:

答案 0 :(得分:0)

您似乎正在为同一disconnect事件注册多个事件侦听器。在这段代码中:

nodeServer.on('data', function(data) {
 if(aSocket!=null){
    aSocket.emit('pushToWebClient',useData);
    aSocket.on('disconnect', function () {
      console.log('DISCONNECTED FROM CLIENT');
    });

  }

每次收到disconnect消息时,您似乎正在注册新的data事件侦听器。因此,如果您有多个侦听器,那么当套接字断开连接时,每个侦听器都会被调用,结果是您将为同一个套接字多次记录相同的消息。

您可以通过将disconnect处理程序移动到connection处理程序来验证这是发生了什么,因此每个套接字只会附加一次。

此外,将asocket放入全局或模块级变量意味着您的服务器代码一次只能与一个客户端一起使用。当您获得nodeserver连接上的数据时,无论您是否尝试将该数据仅发送到一个特定客户端或所有已连接的客户端,目前尚不清楚您要尝试做什么。

答案 1 :(得分:0)

我尝试删除代码:

aSocket.on('disconnect', function () {
      console.log('DISCONNECTED FROM CLIENT');
    });

或将其移出nodeServer处理程序,

它变成了正常状态,从不建议我使用setMaxlisener。

我认为将一个API放入API

可能是不正确的

并且envent可能不会释放套接字,因此它会多次控制。

答案 2 :(得分:0)

编辑:我正在将其移至顶端,因为我看到有人已提供我的解决方案,但您在管理发送到客户端的数据时遇到问题。每个连接到您应用的新客户端都会覆盖您的Student变量。如果要使用服务器aSocket将数据发送到特定客户端,则应创建一个全局变量(数组)来跟踪所有客户端套接字连接。因此,不要使用一个全局变量nodeServer,而是执行以下操作:

aSocket

让我知道它是怎么回事! 我的原始答案如下:

尝试移动

var net=require('net');
var nodeServer = new net.Socket();
var clients = [];

io.on('connection', function (socketIO) {
    clients.push(socketIO);
    var clientNum = clients.length-1;
    aSocket.on('disconnect', function () {
        clients.splice(clientNum, 1);
        console.log('DISCONNECTED FROM CLIENT: '+socketIO.id);
    });
};

nodeServer.on('data', function(data) {
//have your data object contain an identifier for the client that caused the handler to fire
//for the sake of the answer I just use data.id

    var clientID = data.id;
    if(clients[clientID]!=null){
        clients[clientID].emit('pushToWebClient', useData);
    }
}

从您的aSocket.on('disconnect', function () { console.log('DISCONNECTED FROM CLIENT'); }); 事件监听器进入nodeServer.on('data', ...)事件监听器,如下所示:

io.on('connection', ...)

socket.io 旨在保持轮询以确定是否存在服务器/客户端。如果服务器或客户端断开连接,则剩余的“侧”继续接收轮询请求,因此将连续打印错误。

断开服务器并打开客户端页面时,您可以在浏览器中看到客户端的此效果。如果您查看浏览器的错误/控制台日志,您应该看到的是 net :: ERR_CONNECTION_REFUSED 错误的连续流。通过将disconnect事件处理程序放在服务器的io.on('connection', function (socketIO) { aSocket=socketIO; aSocket.on('disconnect', function () { console.log('DISCONNECTED FROM CLIENT'); }); }; 处理程序中,您可以看到与此情况相反的情况。

net:ERR_CONNECTION_REFUSED example

答案 3 :(得分:-1)

  

这是socket.io

的基本代码      

以下示例将socket.io附加到普通的Node.JS HTTP   服务器在端口3000上侦听。

var server = require('http').createServer();
var io = require('socket.io')(server);
io.on('connection', function(client){
  client.on('event', function(data){});
  client.on('disconnect', function(){});
});
server.listen(3000);

我想,你应该试试。