gpt4 book ai didi

node.js - 同步处理新的 TCP 连接

转载 作者:太空宇宙 更新时间:2023-11-04 03:09:55 27 4
gpt4 key购买 nike

我知道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)的范围?

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

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

最佳答案

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

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,从套接字传入的数据就会被缓冲,直到您读取数据为止。

关于node.js - 同步处理新的 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25474455/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com