- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我了解如何在 Node 的新 Streams2
库中使用可写流,但我不了解如何使用可读流。
例如,围绕 dgram
模块的流包装器:
var dgram = require('dgram');
var thumbs = {
twiddle: function() {}
};
var defaults = {
address: '0.0.0.0',
type: 'udp4',
port: 12345,
broadcast: null,
multicast: null,
multicastTTL: 1
};
var UDPStream = function(options) {
if (!(this instanceof UDPStream))
return new UDPStream(options);
Duplex.call(this);
options = options || {};
this.address = options.address || defaults.address;
this.type = options.type || defaults.type;
this.port = options.port || defaults.port;
this.broadcast = options.broadcast || defaults.broadcast;
this.multicast = options.multicast || defaults.multicast;
this.multicastTTL = options.multicastTTL || defaults.multicastTTL;
this._socket = dgram.createSocket(this.type, setup.bind(this));
this._socket.on('message', this.push.bind(this));
};
util.inherits(UDPStream, Duplex);
var setup = function() {
if (this.multicast) {
this._socket.addMembership(this.multicast);
this._socket.setMulticastTTL(this.multicastTTL);
this.destination = this.multicast;
} else {
// default to using broadcast if multicast address is not specified.
this._socket.setBroadcast(true);
// TODO: get the default broadcast address from os.networkInterfaces() (not currently returned)
this.destination = this.broadcast || '255.255.255.255';
}
};
UDPStream.prototype._read = function(size) {
thumbs.twiddle();
};
UDPStream.prototype._write = function(chunk, encoding, callback) {
this._socket.send(chunk, 0, chunk.length, this.port, this.destination);
callback();
};
module.exports = UDPStream;
除了 _read
实现之外,一切都有意义。这简直就是在胡闹,因为我不明白我应该在那里做什么。当 udp 套接字发出新消息时,我的数据被推送,但我无法暂停或恢复底层资源。这应该是什么样的?
最佳答案
_read 是暂停恢复机制的一部分。来自 NodeJS API 文档
When data is available, put it into the read queue by calling readable.push(chunk). If push returns false, then you should stop reading. When _read is called again, you should start pushing more data.
因此,在您的 _write 函数中,如果 socket.send
调用因返回 false 或调用带有错误的回调而失败,您应该暂停流。 _read
然后可以简单地做 this._paused = false
可能看起来像这样。
UDPStream.prototype._read = function() {
this._paused = false;
}
UDPStream.prototype._write = function(chunk, encoding, callback) {
if(!this._paused)
this._socket.send(chunk, 0, chunk.length, this.port, this.destination);
};
关于Node.js 可读流 _read 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17600705/
这里的代码块运行良好,直到调用 _read 函数,之后它无缘无故地更改文件句柄变量“fh”的值。 std::string& xLogFile; std::string& xBuffer
以下2个下标有什么区别? subscript(position: Int) { get { ... } } subscript(position: Int) { _read { ...
本题是如何真正实现一个可读流的read方法。 我有一个可读流的实现: import {Readable} from "stream"; this.readableStream = new Readab
我开始在 Atmel Studio 中收到以下链接器错误: c:/program files (x86)/atmel/studio/7.0/toolchain/arm/arm-gnu-toolchai
我了解如何在 Node 的新 Streams2 库中使用可写流,但我不了解如何使用可读流。 例如,围绕 dgram 模块的流包装器: var dgram = require('dgram'); v
我创建自己的阅读流。但我想知道_read()什么时候被调用?如果我不添加on('data')监听器,_read()就不会被调用,为什么? var data = [{"id":0,"name":"obj
我在 win32 下编译 mpg123 库。它不希望它链接到 MSVCR90.DLL 我改变了:C/C++ -> “忽略所有默认库”为 YES 添加“附加依赖项”==> libcmt.lib 《C/C
在 Node.js 中,我有一个可读流: var rs = new (require('stream').Readable);
我正在尝试找出 Node 中的流并尝试 the stream handbook 中的一些示例 我正在尝试 _read可读流的方法。它说,它接受一个参数,该参数是消费者想要读取的字节数。 我有两个问题。
我正在将一个简单的 socket 客户端程序从 Linux 迁移到 Windows (VS2012)。该程序使用常规的close、read 和write 函数。 在 VS2012 中编译时,我收到以下
我是一名优秀的程序员,十分优秀!