最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

什么是Websockets的net.connect()。write()?

运维笔记admin16浏览0评论

什么是Websockets的net.connect()。write()?

什么是Websockets的net.connect()。write()?

例如,如果我有var remote = net.connect(); remote.write(data) && ...,我可以得到一个布尔值,指示远程是否正在写入数据,所以如果我有:

var remote = new WebSocket('???', {
  protocol: 'binary'
});

我怎么知道远程是否在写数据?

回答如下:

我没有看到任何记录的方式来做你正在谈论的事情所以你必须查看你的图书馆的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()返回值,但这需要分叉库并在几个地方修改代码。

我提交了一个issue with the webSocket Github project,以防我们遗漏某些内容,或者如果作者对如何处理此问题或者他们决定修复它有其他想法。


有人建议here处理这个问题的方法是使用可以传递给ws.send(data, callback)的回调,并且在实际发送数据时将调用回调。这不是您要求的,但是the issue I filed on Github建议您处理原始问题。

发布评论

评论列表(0)

  1. 暂无评论