有没有办法在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连接,因此我们只是捎带它。
以下是我尝试过的解决方案:
为隐藏在某个地方的套接字找到一个阻塞读取函数,类似于节点网络模块中的python&#s插槽库。
string_from_tcp = socket.recv(1024)
这里的问题是它似乎并不存在(不出所料,因为它违背了节点的意识形态)。
此syncnet module添加了我需要的内容,但没有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不在使用它的课程范围内。
使用node-gyp并向我们的节点模块添加一个接口,该接口支持C ++ TCP库,它支持同步读取,例如boost& asio。这可能会有效但是使用boost cross平台编译节点模块一直是一个巨大的痛苦。所以我来Stack Overflow确保我不会过度复杂化这个问题。
简单来说,我只是想创建一个支持同步tcp读取的命令行JavaScript程序。
那么还有其他想法吗?如果在节点项目的上下文中这似乎是亵渎神明的话,请提前抱歉,并感谢任何输入。