同步处理新的TCP连接

时间:2014-08-24 17:37:59

标签: node.js

我知道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
Receive a connection
Connected to server
Connected to server

但期望是:

Received a connection
Connected to server
Receive a connection
Connected to server

这是什么方法?

一种解决方案是实现一种排队类型的解决方案,并且已经完成了排放'或者'完成'处理下一次连接的事件。

为此,我们可能必须从createServer调用中取出连接回调。在这种情况下如何处理连接和其他变量(testvar)的范围?

在这种情况下,如果在队列中但尚未处理但尚未处理的数据连接上收到数据/消息,会发生什么?'听众已注册。?

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

1 个答案:

答案 0 :(得分:4)

我认为将synchronous代码与serial代码的概念分开是很重要的。您希望以串行方式处理每个请求,但在异步处理每个请求时仍可以完成。对于您的情况,最简单的方法可能是拥有一个处理请求队列。

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,来自套接字的数据将被缓冲,直到您读取数据。