node.js:如何在2个不同的路由中同步套接字接收

时间:2015-08-23 04:04:50

标签: node.js

我还在学习node.js基础知识。我的流程是这样的, browser<-->node<-->backend server进行计算。

节点和后端使用套接字进行通信。

在浏览器中有开始/停止按钮,要求后端启动/停止 计算

当节点要求后端启动/停止时,它必须查询后端是否为 先活着。

我的代码是这样的 -

app.get('/stopCmd', function(req, res)
{
    socketToBackendServer.write("status", function() {
        console.log("Sending:", 'Node asking for STATUS');
    });

    socketToBackendServer.on("data", function() {
        if(status is ok) // pseudo code
        {
            socketToBackendServer.write("stop", function() {
                console.log("Sending:", 'Node sending STOP');
            });
        } else {
            console.log("backend server is NOT ready");
        }
    });
});
app.get('/startCmd', function(req, res)
{
    // do similar things as stopCmd
});

/////////////////////////////////////////////////
var socketToBackendServer = net.connect(2899);
function openSocket() {
    socketToBackendServer.setKeepAlive(true);
    socketToBackendServer.on('connect', onConnect.bind({}, socketToBackendServer));
    socketToBackendServer.on('error', onError.bind({}, socketToBackendServer));
}


function onConnect(socket) {    
    var myData;

    console.log('Socket is open!');

    socket.on('data', function(data) {
        console.log('Received:', data);
        io.emit('time', { time: data.toJSON() });
    });
}

function onError(socket) {
    console.log('Socket error!');
    // Kill socket
    clearInterval(interval);
    socket.destroy();
    socket.unref();
    // Re-open socket
    setTimeout(openSocket, 1e3);
}

openSocket();

server.listen(7778);

如果使用相同的浏览器,如果我发疯了点击开始/停止......对于&#34; stopCmd&#34;,如何确定何时查询&#34; status&#34;,响应被捕获 通过它的功能,而不是&#34; startCmd&#34;&#39; s? 这条线 socketToBackendServer.on(&#34; data&#34;,function()

再次感谢你!

1 个答案:

答案 0 :(得分:0)

您可以使用多个连接到后端服务器,因此一个功能可以自由使用一个频道,响应不会混合。

或者您可以使用多重功能,您可以从两个功能调用:

  1. 如果您可以识别您的请求,例如您发送并使用状态ID,例如socketToBackendServer.write(&#34;状态1&#34;,...,并且您发送带有状态的ID),它可以工作从后端服务器返回响应(如果是你的)。通过这种方式,你可以同时发送多个请求,当响应到来时,你可以识别它,并使用id调用存储在数组中的回调函数
  2. 您只发送一个请求,并在发送另一个请求之前等待响应。您必须使用存储请求的等待队列和回调函数。