问题描述
我已经在node.js中编写了一个应用程序,该应用程序由用于存储/上传文件的服务器和客户端组成。
出于复制目的,这是使用服务器中的空写入流和客户端中的随机读取流的概念证明。
在Ubuntu 18.04上使用node.js 12.19.0。客户端依赖于node-fetch v2.6.1。
我遇到的问题是在60秒后重置连接,并且没有找到使之工作的方法。
任何想法都值得赞赏。
谢谢。
testServer.js
// -- DevNull Start --
var util = require('util'),stream = require('stream'),Writable = stream.Writable,setImmediate = setImmediate || function (fn) { setTimeout(fn,0) }
;
util.inherits(DevNull,Writable);
function DevNull (opts) {
if (!(this instanceof DevNull)) return new DevNull(opts);
opts = opts || {};
Writable.call(this,opts);
}
DevNull.prototype._write = function (chunk,encoding,cb) {
setImmediate(cb);
}
// -- DevNull End --
const http = require('http');
const server = http.createServer();
server.on('request',async (req,res) => {
try {
req.socket.on('end',function() {
console.log('SOCKET END: other end of the socket sends a FIN packet');
});
req.socket.on('timeout',function() {
console.log('SOCKET TIMEOUT');
});
req.socket.on('error',function(error) {
console.log('SOCKET ERROR: ' + JSON.stringify(error));
});
req.socket.on('close',function(had_error) {
console.log('SOCKET CLOSED. IT WAS ERROR: ' + had_error);
});
const writeStream = DevNull();
const promise = new Promise((resolve,reject) => {
req.on('end',resolve);
req.on('error',reject);
});
req.pipe(writeStream);
await promise;
res.writeHead(200);
res.end('OK');
} catch (err) {
res.writeHead(500);
res.end(err.message);
}
});
server.listen(8081)
.on('listening',() => { console.log('Listening on port',server.address().port); });
testClient.js
// -- RandomStream Start --
var crypto = require('crypto');
var stream = require('stream');
var util = require('util');
var Readable = stream.Readable;
function RandomStream(length,options) {
// allow calling with or without new
if (!(this instanceof RandomStream)) {
return new RandomStream(length,options);
}
// init Readable
Readable.call(this,options);
// save the length to generate
this.lenToGenerate = length;
}
util.inherits(RandomStream,Readable);
RandomStream.prototype._read = function (size) {
if (!size) size = 1024; // default size
var ready = true;
while (ready) { // only cont while push returns true
if (size > this.lenToGenerate) { // only this left
size = this.lenToGenerate;
}
if (size) {
ready = this.push(crypto.randomBytes(size));
this.lenToGenerate -= size;
}
// when done,push null and exit loop
if (!this.lenToGenerate) {
this.push(null);
ready = false;
}
}
};
// -- RandomStream End --
const fetch = require('node-fetch');
const runSuccess = async () => { // Runs in ~35 seconds
const t = Date.now();
try {
const resp = await fetch('http://localhost:8081/test',{
method: 'PUT',body: new RandomStream(256e6) // new RandomStream(1024e6)
});
const data = await resp.text();
console.log(Date.now() - t,data);
} catch (err) {
console.warn(Date.now() - t,err);
}
};
const runFail = async () => { // Fails after 60 seconds
const t = Date.now();
try {
const resp = await fetch('http://localhost:8081/test',body: new RandomStream(1024e6)
});
const data = await resp.text();
console.log(Date.now() - t,err);
}
};
// runSuccess().then(() => process.exit(0));
runFail().then(() => process.exit(0));
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)