Node.js缓冲套接字数据

Node.js缓冲套接字数据,node.js,express,socket.io,Node.js,Express,Socket.io,我正在使用当前版本的all things node.js、express.js、socket.io等。。。我正试图连接到一个服务器,而这个服务器的唯一目的就是输出文本,然后通过socket.io将其发送到连接的web客户端。文本只不过是带有标准行尾的字符串,最大数据速率大约为1024字节/秒。我的代码,核心位,是这样的 var express = require('express') , app = express() , routes = require('./routes') ,

我正在使用当前版本的all things node.js、express.js、socket.io等。。。我正试图连接到一个服务器,而这个服务器的唯一目的就是输出文本,然后通过socket.io将其发送到连接的web客户端。文本只不过是带有标准行尾的字符串,最大数据速率大约为1024字节/秒。我的代码,核心位,是这样的

var express = require('express')
  , app = express()
  , routes = require('./routes')
  , user = require('./routes/user')
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server)
  , path = require('path')
  , dataSourcePort = 5000
  , host = "10.0.1.32"
  , dataStream = require('net').createConnection(dataSourcePort, host);

dataStream.setEncoding('utf8');

io.sockets.on('connection', function (socket) {
    dataStream.on('data',function(data){
        socket.emit("stuff",data);
    });  
  });

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

app.get('/', routes.index);
app.get('/users', user.list);

server.listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

这一切都很好,但每隔一段时间它就会挂起,因为数据不再发送到客户端。我假设一个缓冲区在线路的某个地方被填满了,但不确定。有没有更好的方法来做到这一点并避免填充部分?

我看到的主要问题是,您从未解开
数据处理程序的绑定,因此当人们连接和断开连接时,您将积累
数据
侦听器和内存使用情况,并浪费资源试图将数据发送到断开连接的套接字

io.sockets.on('connection', function (socket) {
  function ondata(data){
    socket.emit("stuff",data);
  }

  function ondisconnect(){
    dataStream.off('data', ondata);
    socket.off('disconnect', ondisconnect);
  }

  dataStream.on('data', ondata);
  socket.on('disconnect', ondisconnect);
});