Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有Node.js的用户可配置TCP流_Node.js_Socket.io - Fatal编程技术网

具有Node.js的用户可配置TCP流

具有Node.js的用户可配置TCP流,node.js,socket.io,Node.js,Socket.io,我正在尝试使用node.js设置到客户端的TCP流,用户可以在其中指定数据主机和端口。我使用socket.io创建到客户端的套接字连接,并使用net.createConnection建立流。一旦建立了流,我需要将数据从流发送到客户机套接字。除了客户端更改主机和/或数据套接字的情况外,我的代码可以正常工作。似乎一旦建立了客户端套接字,我就可以更改TCP流上的端口或主机。接收到套接字消息,主机和端口的值使其到达正确的位置。但是没有乐趣,来自TCP流的数据没有连接,并且.on(错误)、.on(连接)等

我正在尝试使用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);

总结一下我和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);
        }
    });
});

总结一下我和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);
        }
    });
});

您正在用新的tcp连接替换
datastream
对象。在
connectString
案例中,必须在
datastream=net.createConnection
之后重新连接
datastream
事件处理程序。还要注意,对于所有连接的客户端,您都有一个共享的
datastream
,当一个客户端发送
connectString
时,
数据流将被替换(同样适用于所有客户端)。但是所有其他客户端的事件处理程序都将丢失。我建议您为每个客户端保留一个
dataStream
(即,在
连接
处理程序中初始化它。您将用新的tcp连接替换
数据流
对象。您必须在
连接字符串
案例中的
数据流=net.createConnection
之后重新附加
事件处理程序。还要注意,您有一个共享的
数据流
对于所有连接的客户端,当一个客户端发送
连接字符串时,
数据流
将被替换(对于所有客户端也是如此)。但是所有其他客户端的事件处理程序都将丢失。我建议您改为为为为每个客户端保留一个
数据流
(即,在代码<连接> <代码>处理器中初始化它。来自新手的多谢!这是我需要的骨头。太好了!如果答案是让你满意的,请考虑点击答案左边的大复选框来接受它。如果主机上的数据:端口退出,我会怎么重新连接数据流。我尝试过。在数据流中放置setTimeout.on('end',function(){setTimeout(function(){dataStream.connect(port,host);},1000);})当主机停止在数据流连接的端口上生成数据时,这个StimeTimeT似乎不被激活。非常感谢一个菜鸟!这是我需要的骨头。太棒了!如果答案是你满意的,请考虑通过点击答案左边的大复选框来接受它。我将如何重新连接?在主机:端口上的数据退出的情况下使用dataStream。我尝试在dataStream中放置setTimeout。在('end',function(){setTimeout(function(){dataStream.connect(port,host);},1000);})上;当主机停止在数据流连接的端口上生成数据时,此setTimeout似乎不会被激活。