例如,如果我有var remote = net.connect(); remote.write(data) && ...
我可以得到一个布尔值,表明远程是否在写数据,所以如果我有:
var remote = new WebSocket('???', {
protocol: 'binary'
});
我如何知道远程是否在写数据?
答案 0 :(得分:0)
我没有看到任何记录的方式去做你正在谈论的事情所以你必须查看你的图书馆的source code,看看你能找到什么。
首先,webSocket类本身是EventEmitter
,包含一个名为_socket
的属性,它是实际的TCP套接字。因此,如果必须,您可以直接访问。
_socket
属性已初始化here。
send()
方法定义为here。您将看到的第一件事是它没有任何返回值,因此它肯定不会返回您从remote.write()
得到的内容。相反,发送逻辑在Sender
对象here中实现,在构建正确的帧格式后,最终调用sendFrame()
here。在那里你可以看到实际的套接字写入:
sendFrame (list, cb) {
if (list.length === 2) {
this._socket.write(list[0]);
this._socket.write(list[1], cb);
} else {
this._socket.write(list[0], cb);
}
}
并且,您可以看到socket.write()
的返回值被忽略,因此如果不修改库的代码就无法使用它。
我老实说没有任何方法可以知道写缓冲区何时已满。套接字对象上有一个drain
事件,它会告诉您写缓冲区何时已满且不再满,您可以监听,但我没有看到任何支持的方式来知道它何时变满。我猜你可以做的一件事是从外部覆盖_socket.write()
方法,并在缓冲区满了时将自己的事件发送到webSocket对象。
似乎最干净的修复方法是从.send()
返回值,返回.write()
的值,但这需要分叉库并在几个地方修改代码。< / p>
我提交issue with the webSocket Github project以防我们遗漏某些内容,或者如果作者对如何处理此问题有其他想法,或者他们决定修复它。
有人建议here处理此问题的方法是使用可以传递给ws.send(data, callback)
的回调,并在实际发送数据时调用回调。这不完全符合您的要求,但the issue I filed on Github建议您处理原始问题。