gpt4 book ai didi

javascript - Node.js 中的同步 TCP 读取

转载 作者:可可西里 更新时间:2023-11-01 02:32:52 28 4
gpt4 key购买 nike

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

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

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

我也知道尝试使用函数调用来阻止而不是注册回调违反了 Node 的设计,但我们正在尝试更新一个旧的 Node 模块,该模块充当我大学的客户端,同时保持向后兼容性。所以我们目前有:

var someData = ourModule.getData();

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

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

  1. 在 Node 的 net 模块中找到一个隐藏在类似于 python 套接字库的地方的套接字的阻塞读取函数。

    string_from_tcp = socket.recv(1024)

    这里的问题是它似乎不存在(不足为奇,因为它违背了 Node 的意识形态)。

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

  3. 找到一个允许 Node 解除事件循环阻塞的函数,然后返回,这样就可以工作了:

    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 超出了使用它的类(class)的范围。

  5. 使用 node-gyp 并向我们的 Node 模块添加一个 C++ TCP 库的接口(interface),该库支持同步读取,例如 boost 的 asio。这可能会奏效,但让 Node 模块与 boost 跨平台编译一直是一个巨大的痛苦。所以我来到 Stack Overflow 以确保我没有让这个问题过于复杂。

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

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

最佳答案

我最终选择了选项 5。我在 C++ ( netLink ) 中找到了一个小型、快速且易于构建的 TCP 库,并为其编写了一个 Node 模块包装器,恰本地命名为 netlinkwrapper。 .

该模块构建在 Windows 和 Linux 上,但由于它是一个 C++ 插件,您需要配置 node-gyp 来构建它。

我希望没有其他人必须像我使用这个模块那样搞砸 Node.js,但是如果你必须用 TCP 调用阻止事件循环,这可能是你唯一的选择。

关于javascript - Node.js 中的同步 TCP 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31996603/

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