Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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 - Fatal编程技术网

Node.js 同步处理新的TCP连接

Node.js 同步处理新的TCP连接,node.js,Node.js,我知道nodejs本质上是异步的,最好使用这种方式,但我有一个用例,我们需要以同步方式处理传入的TCP连接。一旦收到新的连接,我们需要连接到其他TCP服务器,执行一些簿记等操作,然后处理其他连接。因为连接的数量是有限的,所以可以用同步的方式处理 正在寻找一种优雅的方式来处理这种情况 net.createServer(function(sock) { console.log('Received a connection - '); var sock = null; var

我知道nodejs本质上是异步的,最好使用这种方式,但我有一个用例,我们需要以同步方式处理传入的TCP连接。一旦收到新的连接,我们需要连接到其他TCP服务器,执行一些簿记等操作,然后处理其他连接。因为连接的数量是有限的,所以可以用同步的方式处理

正在寻找一种优雅的方式来处理这种情况

net.createServer(function(sock) {
    console.log('Received a connection - ');
    var sock = null;
    var testvar = null;        

    sock = new net.Socket();        
    sock.connect(PORT, HOST, function() {
        console.log('Connected to server - ');
    });

    //Other listeners
}
在上述代码中,如果同时接收到两个连接,则输出可能是(因为异步性质):

但人们的期望是:

Received a connection
Connected to server
Receive a connection
Connected to server
什么才是正确的方法

一种解决方案是实现一种队列类型的解决方案,通过发出“完成”或“完成”事件来处理下一个连接

为此,我们可能必须将连接回调从createServer调用中去掉。在这种情况下,如何处理连接和其他变量(testvar)的作用域

在这种情况下,如果在队列中但尚未处理且尚未注册“数据”侦听器的连接上接收到数据/消息,会发生什么情况


任何其他更好的解决方案都会很有帮助。

我认为将
同步
代码与
串行
代码的概念分开是很重要的。您希望以串行方式处理每个请求,但在异步处理每个请求时仍然可以实现这一点。对于您的情况,最简单的方法可能是使用一个请求队列来处理

var inProgress = false;
var queue = [];
net.createServer(function(sock){
    queue.push(sock);

    processQueue();
});

function processQueue(){
    if (inProgress || queue.length === 0) return;
    inProgress = true;

    handleSockSerial(queue.shift(), function(){
        inProgress = false;

        processQueue();
    });
}

function handleSockSerial(sock, callback){
    // Do all your stuff and then call 'callback' when you are done.
}

注意,只要您使用的节点
=0.10
,从套接字传入的数据将被缓冲,直到您读取数据。

我认为将
同步
代码与
串行
代码的概念分开是很重要的。您希望以串行方式处理每个请求,但在异步处理每个请求时仍然可以实现这一点。对于您的情况,最简单的方法可能是使用一个请求队列来处理

var inProgress = false;
var queue = [];
net.createServer(function(sock){
    queue.push(sock);

    processQueue();
});

function processQueue(){
    if (inProgress || queue.length === 0) return;
    inProgress = true;

    handleSockSerial(queue.shift(), function(){
        inProgress = false;

        processQueue();
    });
}

function handleSockSerial(sock, callback){
    // Do all your stuff and then call 'callback' when you are done.
}

注意,只要您使用的是node
=0.10
,从套接字传入的数据就会被缓冲,直到您读取数据为止。

感谢您的帮助。如果我在函数(sock){var mysock;}中定义了一个局部变量,它会为每个传入连接保留单独的值并保留在内存中,直到连接被激活吗?我认为这与闭包有关,您能澄清一下吗?一旦调用回调并在
handleSockSerial
中完成所有处理,函数上下文将完全超出范围,并将被垃圾收集。感谢您的深入了解。如果我在函数(sock){var mysock;}中定义了一个局部变量,它会为每个传入连接保留单独的值并保留在内存中,直到连接被激活吗?我认为这与闭包有关,您能澄清一下吗?一旦调用回调并在
handleSockSerial
中完成所有处理,函数上下文将完全超出范围,并将被垃圾收集。