我想實現一個通過套接字發送和接收文件的協議。該協議是指定的,我不能改變這一點。在NodeJs中對Stream實現感到困惑
我是新來的NodeJs,這是我如何實現這一點。
我會寫一個雙工流,並將管道文件寫入它。然後將其插入套接字以發送數據。
我應該閱讀這些內容以及在哪裏寫這些內容。如何知道讀取文件已完成,以及如何告知socket已完成。 Docs對我來說不是很清楚,並且Google使用了更多的混淆:)
任何幫助,將不勝感激。
P.S.當我回家時,我會添加自己的樣本,但現在我沒有。
編輯
@ MattHarrison的回答後,我改變了代碼轉換成這樣:
var stream = require('stream');
var util = require('util');
var bufferpack = require('bufferpack');
var fs = require('fs');
var net = require('net');
var MyProtocolStream = function() {
this.writtenHeader = false; // have we written the header yet?
stream.Transform.call(this);
};
util.inherits(MyProtocolStream, stream.Transform);
MyProtocolStream.prototype._transform = function (chunk, encoding, callback) {
if (!this.writtenHeader) {
this.push('==== HEADER ====\n'); // if we've not, send the header first
}
// Can this function be interrupted at this very line?
// Then another _transform comes in and pushes its own data to socket
// Corrupted data maybe then?
// How to prevent this behavior? Buffering whole file before sending?
var self = this;
// I put a random timeout to simulate overlapped calls
// Can this happen in real world?
setTimeout(function() {
self.push(chunk); // send the incoming file chunks along as-is
callback();
}, Math.random()*10);
};
MyProtocolStream.prototype._flush = function (callback) {
this.push('==== FOOTER ====\n'); // Just before the stream closes, send footer
callback();
};
var file = '/tmp/a';
var server = net.createServer(function (sck) {
sck.addr = sck.remoteAddress;
console.log('Client connected - ' + sck.addr);
fs.createReadStream('/tmp/a').pipe(new MyProtocolStream()).pipe(sck);
fs.createReadStream('/tmp/b').pipe(new MyProtocolStream()).pipe(sck);
fs.createReadStream('/tmp/c').pipe(new MyProtocolStream()).pipe(sck);
sck.on('close', function() {
console.log('Client disconnected - ' + this.addr);
})
});
server.listen(22333, function() {
console.log('Server started on ' + 22333)
});
看到我的評論在_transform
。
這個問題現在太模糊了。你至少應該自己嘗試一下,然後問一個關於我們可以幫助的痛點的具體問題。 –
@MattHarrison你是對的。我現在在家,並添加了我的示例代碼。 – vfsoraki
你說你試圖實現一個自定義協議,但它看起來像只是在重新發明節點流時發送文件到套接字。您的自定義協議實際上做了什麼?也許你應該從那開始。 –