在NodeJS中构建NNTP客户端时,遇到了以下问题。调用XZVER命令时,我从套接字连接收到的第一个数据包含字符串和膨胀字符串;
224 compressed data follows (zlib version 1.2.3.3)
^*�u�@����`*�Ti���d���x�;i�R��ɵC���eT�����U'�|/S�0���� rd�
z�t]2���t�bb�3ѥ��>�͊0�ܵ��b&b����<1/ �C�<[<��d���:��VW̡��gBBim�$p#I>5�cZ�*ψ%��u}i�k�j
�u�t���8�K��`>��im
当我分割这个字符串并试图像这样膨胀它时;
lines = chunk.toString().split('\r\n');
response = lines.shift();
zlib.inflate(new Buffer(lines.shift()), function (error, data) {
console.log(arguments);
callback();
});
我收到以下错误;
[Error: invalid code lengths set] errno: -3, code: 'Z_DATA_ERROR'
欢迎任何帮助,我有点困在这里:(
更新
在实现了mscdex的答案之后,整个函数看起来像这样;
var util = require('util'),
zlib = require('zlib'),
Transform = require('stream').Transform;
function CompressedStream () {
var self = this;
this._transform = function (chunk, encoding, callback) {
var response = chunk.toString(),
crlfidx = response.indexOf('\r\n');
response = response.substring(0, crlfidx);
console.log(response);
zlib.gunzip(chunk.slice(crlfidx + 2), function (error, data) {
console.log(arguments);
callback();
});
};
Transform.call(this/*, { objectMode: true } */);
};
util.inherits(CompressedStream, Transform);
module.exports = CompressedStream;
答案 0 :(得分:0)
如果这两个字节在原始数据中,您应该避免使用split()
。您可以尝试这样的事情:
var response = chunk.toString(),
crlfidx = response.indexOf('\r\n');
// should probably check crlfidx > -1 here ...
response = response.substring(0, crlfidx);
zlib.inflate(chunk.slice(crlfidx + 2), function (error, data) {
console.log(arguments);
callback();
});
但是,如果您在'data'事件处理程序中执行此操作,则应注意您可能无法在单个块中获取所需的数据。具体来说,您可以在块之间获得CRLF分割,或者您可以在一个块中获得多个响应。
答案 1 :(得分:0)
似乎我的块被错误编码了。删除socket.setEncoding('utf8');
后,问题就解决了。