用户可以使用Node.js配置TCP流

时间:2012-03-26 08:58:03

标签: node.js socket.io

我正在尝试使用node.js为客户端设置TCP流,用户可以在其中指定数据主机和端口。我使用socket.io创建到客户端的套接字连接和net.createConnection来建立流。建立流后,我需要将数据从流发送到客户端套接字。除了客户端更改主机和/或数据套接字的情况外,我的代码都有效。似乎一旦建立了客户端套接字,我就可以更改TCP流上的端口或主机。收到套接字消息,主机和端口的值使其到达正确的位置。但没有快乐,来自TCP流的数据没有连接,似乎.on(错误),。on(连接)等不起作用。我有范围问题吗?下面的代码块中的隐含范围是我目前如何设置它。你可以折腾我的任何骨头都会让狗开心。我在一个洞里,似乎无法离开。

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);

1 个答案:

答案 0 :(得分:1)

总结一下我和Ben Taber上面的评论,这个解决方案可能会更好:

// 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);
        }
    });
});