Javascript Node.js中的同步TCP读取

Javascript Node.js中的同步TCP读取,javascript,node.js,tcp,boost-asio,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

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

我很清楚如何通过向套接字的“数据”事件添加回调来异步执行此操作:

socket.on('data', function(data) {
    // now we have the string data to do whatever with
});
我还意识到,尝试用函数调用来阻止而不是注册回调不符合节点的设计,但我们正在尝试更新一个旧的节点模块,该模块充当我所在大学的客户端,同时保持向后兼容性。因此,我们目前有:

var someData = ourModule.getData();
其中
getData()
之前有一系列逻辑,但现在我们只想发送到服务器“rungetdata()”并等待结果。这样,所有的逻辑都是服务器端的,而不是重复的客户端和服务器端。这个模块已经维护了到服务器的TCP连接,所以我们只是在这个基础上进行

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

  • 在节点的网络模块中找到隐藏在类似于python套接字库的地方的套接字的阻塞读取函数

    string_from_tcp = socket.recv(1024)
    
    这里的问题是它似乎不存在(毫不奇怪,因为它违背了node的意识形态)

  • 这增加了我所需要的,但没有Windows支持;所以我必须补充一点

  • 查找允许的节点取消阻止事件循环的函数,然后返回,以便:

    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!
    
    这里明显的问题是,我认为这样的事情不存在

  • 使用ECMAScript 6生成器函数:

    var stringFromTcp = yield socketRead(1024);
    
    这里的问题是,我们会强迫学生将他们的JavaScript客户端更新为这种新语法,并且理解ES6超出了使用这种语法的课程的范围

  • > P>使用节点GYP并添加到节点模块中,它是一个C++支持的TCP库的接口,它支持同步读取,如Boost的ASIO。这可能会起作用,但让节点模块使用boost跨平台编译是一个巨大的痛苦。所以我来讨论堆栈溢出,以确保不会使这个问题过于复杂

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


    还有其他想法吗?如果这在一个节点项目的上下文中看起来是亵渎神明的话,请提前表示歉意,并感谢您的任何输入。

    我最后选择了选项5。我在C++()中找到了一个小的、快速的、易于构建的TCP库,并为它编写了一个节点模块包装器。 模块是在Windows和Linux上构建的,但由于它是C++插件,所以需要配置节点GYP来构建它。
    我希望其他人不必像我使用此模块那样使用Node.js,但如果您必须使用TCP调用阻止事件循环,这可能是您唯一的赌注。

    谢谢,但我认为socket.io无法解决我的问题。当我试图用代码从服务器同步获取数据时,它只会触发异步事件。。。我只是做了一些网络搜索。有一个
    sync:true
    选项。这可能会有帮助。我没有完全阅读它。祝你好运。那么你有一个函数
    getData()
    ,它与服务器建立连接,获取一些数据,然后返回它?这一切都是同步实现的?您以前在哪个平台执行此代码?感谢ODelibalta对该标志的提醒。它似乎没有改变任何东西,但我将深入研究net模块的源代码,试图找出用于提示的标志。TCP连接已经建立。所有这些都是通过TCP发送一些数据,并期望服务器通过打开的TCP套接字发送的下一个数据是响应。目前,客户机有一份服务器逻辑副本,以了解从
    getData()
    中可以得到什么,但是在客户机和服务器上实现该逻辑每学期都很乏味,因此我们现在尝试要求服务器运行该逻辑并给出结果。