用户可configuration的带有Node.js的TCPstream

我试图build立一个TCPstream到客户端使用node.js用户可以指定数据主机和端口。 我使用socket.io创build一个套接字连接到客户端和net.createConnectionbuild立stream。 一旦streambuild立,我需要将数据从stream发送到客户端套接字。 我的代码除了在客户端更改主机和/或数据套接字的情况下工作。 似乎一旦客户端套接字build立,那么我可以更改TCPstream上的端口或主机。 套接字消息被接收,主机和端口的值使它到达正确的位置。 但没有喜悦,来自TCPstream的数据没有连接,看来.on(error),.on(connect)等不起作用。 我有一个范围问题? 下面代码块中的隐含范围是我现在如何设置的。 任何骨头,你可以折腾我的方式将使狗快乐。 我在一个洞,似乎不能出去。

var express = require('express'), app = module.exports = express.createServer(), io = require('socket.io').listen(app, { log: false }), host = "somehost", port = 2001, dataStream = net.createConnection(port, host); io.sockets.on('connection', function(socket){ dataStream.on('error', function(error){ socket.emit('error',{message:"Data Connection Error "+ error}); }); dataStream.on('connect', function(){ socket.emit('connected',{message:"Data Source Connected"}); }); dataStream.on('data', function(data) { socket.emit(buffer); }); // Handle Client request to change stream socket.on('message',function(data) { var clientMessage = JSON.parse(data); for(var key in clientMessage) { switch (key){ case "connectString":{ if(clientMessage[key].dataHost !== "" && clientMessage[key].dataPort !== ""){ //create new net connection dataStream.end(); dataStream = net.createConnection(clientMessage[key].dataPort,clientMessage[key].dataHost); } break; } } } }); }); app.configure(function(){ app.set('views', __dirname + '/views'); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(__dirname + '/public')); }); app.configure('development', function(){ app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.configure('production', function(){ app.use(express.errorHandler()); }); // Routes app.get('/', routes.index.html); app.listen(3000); 

总结我和上面的Ben Taber的评论,这个解决scheme可能会更好地工作:

 // Set up a connection to host and port, and emit on socket function getDataStream(socket, port, host) { var dataStream = net.createConnection(port, host); dataStream.on('error', function(error){ socket.emit('error',{message:"Data Connection Error "+ error}); }); dataStream.on('connect', function(){ socket.emit('connected',{message:"Data Source Connected"}); }); dataStream.on('data', function(data) { socket.emit('data', data); }); return dataStream; } io.sockets.on('connection', function(socket){ var dataStream = getDataStream(socket, port, host); // Handle Client request to change stream socket.on('message',function(data) { var clientMessage = JSON.parse(data); if('connectString' in clientMessage && clientMessage.connectString.dataHost !== '' && clientMessage.connectString.dataPort !== '') { dataStream.end(); dataStream = getDataStream(socket, clientMessage.connectString.dataPort, clientMessage.connectString.dataHost); } }); });