在 Node.js 中从客户端向服务器发送 HTTP2 中的多个 JSON 数据
Sending multiple JSON data in HTTP2 from client to server in Node.js
我有一个工作的 http2 服务器和客户端,我在其中使用 POST 方法从客户端向服务器发送 JSON 数据。由于 Node.js 中的 http2 具有双工流,我使用事件 'data' 和 'end' 从服务器流读取数据。现在我想多次发送相同的数据。但是如何区分新数据和旧数据呢?
我想使用 sleep 来做到这一点,因为(如果我错了请纠正我)当我们从客户端向服务器发送许多数据包时,它最终会耗尽我所有的 CPU 资源。现在服务器中的流事件在不接收数据(我的意思是 'data' 和 'end')时将如何表现,我将如何再次使用它们来获取数据?假设当服务器接收到数据时,它会将其存储在一个文件中。
服务器:
const h2=require('http2');
const fs=require('fs');
const options={
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
};
//server begin
const server=h2.createSecureServer(options);
server.on('error', (err)=>{throw err});
server.on('stream', (stream, headers)=>{
stream.respond({':status': 200}) //giving out response headers
if(headers[':method']==='POST'){
let data=''
let i=0;
stream.on('data',(chunk)=>{
console.log(`iteration: ${++i}`)
data+=chunk
});
stream.on('end', ()=>{
// stream.close()
console.log('\n')
console.log(JSON.parse(data))
})
}else if(headers[':method']==='GET'){
stream.end('Hello from SMF')
}else{
//else condition
}
})
server.listen(3000, 'localhost');
//server end
客户:
const h2=require('http2');
const fs=require('fs');
const packet=require('./packet.json');
//client start
const client=h2.connect('https://localhost:3000',{ //establishing connection
ca: fs.readFileSync('cert.pem')
});
client.on('error', (err)=>{throw err})
const req=client.request({ //giving out a post request
':method': 'POST',
'content-type': 'application/json'
})
req.setEncoding('utf8');
req.on('error', (err)=>{throw err})
// req.write(JSON.stringify(packet))
req.end(JSON.stringify(packet), ()=>{ //writing the data to SMF
req.on('response', (headers)=>{ //getting the response headers
if(headers[':status']===200) console.log('success')
req.close() //closing client stream
client.close() //closing client session
})
})
//client end
JSON数据:
{
"supi": "imsi-<IMSI>",
"pduSessionId": 235,
"dnn": "<DNN>",
"sNssai": {
"sst": 0
},
"servingNfId": "<AMF Identifier>",
"n1SmMsg": {
"contentId": "n1msg"
},
"anType": "3GPP_ACCESS",
"smContextStatusUri": "<URI>"
}
(我知道我使用过安全服务器,您可以从代码中删除证书并改用 createServer())。
实际上,如果您使用 drain
事件,您应该能够避免 运行 内存不足和崩溃。以下是相关文档:https://nodejs.org/api/stream.html#stream_event_drain
我在 javascript...
中使用 TimeInterval 解决了这个问题
i=0;
let timer=setInterval(()=>{
i++;
req.write(JSON.stringify(packet)); //sending request packet
if(i==5){ //no of packets
req.end(()=>{
req.close();
client.close();
})
clearInterval(timer);
}
}, 10) //time interval
我可以使用这个发送多个文件
我有一个工作的 http2 服务器和客户端,我在其中使用 POST 方法从客户端向服务器发送 JSON 数据。由于 Node.js 中的 http2 具有双工流,我使用事件 'data' 和 'end' 从服务器流读取数据。现在我想多次发送相同的数据。但是如何区分新数据和旧数据呢?
我想使用 sleep 来做到这一点,因为(如果我错了请纠正我)当我们从客户端向服务器发送许多数据包时,它最终会耗尽我所有的 CPU 资源。现在服务器中的流事件在不接收数据(我的意思是 'data' 和 'end')时将如何表现,我将如何再次使用它们来获取数据?假设当服务器接收到数据时,它会将其存储在一个文件中。
服务器:
const h2=require('http2');
const fs=require('fs');
const options={
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
};
//server begin
const server=h2.createSecureServer(options);
server.on('error', (err)=>{throw err});
server.on('stream', (stream, headers)=>{
stream.respond({':status': 200}) //giving out response headers
if(headers[':method']==='POST'){
let data=''
let i=0;
stream.on('data',(chunk)=>{
console.log(`iteration: ${++i}`)
data+=chunk
});
stream.on('end', ()=>{
// stream.close()
console.log('\n')
console.log(JSON.parse(data))
})
}else if(headers[':method']==='GET'){
stream.end('Hello from SMF')
}else{
//else condition
}
})
server.listen(3000, 'localhost');
//server end
客户:
const h2=require('http2');
const fs=require('fs');
const packet=require('./packet.json');
//client start
const client=h2.connect('https://localhost:3000',{ //establishing connection
ca: fs.readFileSync('cert.pem')
});
client.on('error', (err)=>{throw err})
const req=client.request({ //giving out a post request
':method': 'POST',
'content-type': 'application/json'
})
req.setEncoding('utf8');
req.on('error', (err)=>{throw err})
// req.write(JSON.stringify(packet))
req.end(JSON.stringify(packet), ()=>{ //writing the data to SMF
req.on('response', (headers)=>{ //getting the response headers
if(headers[':status']===200) console.log('success')
req.close() //closing client stream
client.close() //closing client session
})
})
//client end
JSON数据:
{
"supi": "imsi-<IMSI>",
"pduSessionId": 235,
"dnn": "<DNN>",
"sNssai": {
"sst": 0
},
"servingNfId": "<AMF Identifier>",
"n1SmMsg": {
"contentId": "n1msg"
},
"anType": "3GPP_ACCESS",
"smContextStatusUri": "<URI>"
}
(我知道我使用过安全服务器,您可以从代码中删除证书并改用 createServer())。
实际上,如果您使用 drain
事件,您应该能够避免 运行 内存不足和崩溃。以下是相关文档:https://nodejs.org/api/stream.html#stream_event_drain
我在 javascript...
中使用 TimeInterval 解决了这个问题i=0;
let timer=setInterval(()=>{
i++;
req.write(JSON.stringify(packet)); //sending request packet
if(i==5){ //no of packets
req.end(()=>{
req.close();
client.close();
})
clearInterval(timer);
}
}, 10) //time interval
我可以使用这个发送多个文件