簡體   English   中英

在 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

我能夠使用這個發送多個文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM