同步TCP读入Node.js

时间:2015-08-13 19:13:53

标签: javascript node.js tcp boost-asio

有没有办法在node.js中同步读取TCP套接字?

我非常了解如何通过向套接字数据'添加回调来异步执行此操作。事件:

socket.on('data', function(data) {
    // now we have the string data to do whatever with
});

我也意识到尝试使用函数调用而不是注册回调来阻止节点的设计,但是我们正在尝试更新作为我大学客户端的旧节点模块。保持向后兼容性。所以我们目前有:

var someData = ourModule.getData();

getData()之前有一堆逻辑,但现在我们只想发送到服务器"运行getData()"并等待结果。这样所有逻辑都是服务器端,而不是重复的客户端和服务器端。该模块已经维护了与服务器的TCP连接,因此我们只是捎带它。

以下是我尝试过的解决方案:

  1. 为隐藏在某个地方的套接字找到一个阻塞读取函数,类似于节点网络模块中的python&#s插槽库。

    string_from_tcp = socket.recv(1024)
    

    这里的问题是它似乎并不存在(不出所料,因为它违背了节点的意识形态)。

  2. syncnet module添加了我需要的内容,但没有Windows支持;所以我必须补充一点。

  3. 找一个允许该节点取消阻止事件循环的函数,然后返回,这样就可以了:

    var theData = null;
    clientSocket.on('data', function(data) {
        theData = data;
    });
    
    clientSocket.write("we want some data");
    
    while(theData === null) {
        someNodeFunctionThatUnblocksEventLoopThenReturnsHere(); // in this function node can check the tcp socket and call the above 'data' callback, thus changing the value of theData
    }
    
    // now theData should be something!
    

    这里明显的问题是我不认为存在这样的事情。

  4. 使用ECMAScript 6生成器函数:

    var stringFromTcp = yield socketRead(1024);
    

    这里的问题是我们强迫学生将他们的JavaScript客户端更新为这种新语法,并且理解ES6不在使用它的课程范围内。

  5. 使用node-gyp并向我们的节点模块添加一个接口,该接口支持C ++ TCP库,它支持同步读取,例如boost& asio。这可能会有效但是使用boost cross平台编译节点模块一直是一个巨大的痛苦。所以我来Stack Overflow确保我不会过度复杂化这个问题。

  6. 简单来说,我只是想创建一个支持同步tcp读取的命令行JavaScript程序。

    那么还有其他想法吗?如果在节点项目的上下文中这似乎是亵渎神明的话,请提前抱歉,并感谢任何输入。

0 个答案:

没有答案