javascript - 在 Node.js 中从客户端向服务器发送 HTTP2 中的多个 JSON 数据

标签 javascript node.js http2 nodejs-stream

我有一个工作的 http2 服务器和客户端,我使用 POST 方法从客户端向服务器发送 JSON 数据。由于 Node.js 中的 http2 具有双工流,因此我使用事件“data”和“end”从服务器流读取数据。现在我想多次发送相同的数据。但是如何区分新数据和旧数据呢?

我想使用 sleep 来做到这一点,因为(如果我错了,请纠正我)当我们从客户端向服务器发送许多数据包时,它最终会耗尽我所有的 CPU 资源。现在,服务器中的流事件在不接收数据(我的意思是“数据”和“结束”)时将如何表现,以及我将如何再次使用它们来获取数据?假设服务器接收数据时将其存储在文件中。

服务器:

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 - 在 Node.js 中从客户端向服务器发送 HTTP2 中的多个 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59425510/

相关文章:

javascript - 如何使在 javascript 中发出的 AJAX 请求在调试器中故意失败以对其进行测试?

javascript - IE11 忽略 javascript matchMedia 事件监听器

node.js - npm WARN 已弃用小型匹配

node.js - MomentJS 不加载语言环境

javascript - 更改选项显示当前时间

javascript - 在 d3 force directed 中,如何通过单击更改 Node 形状?

http2 - 2021年http2服务器推送的现状究竟如何?

gzip - Tomcat 8.5.29 HTTP/2 不支持 GZIP 压缩

node.js - NodeJS - 确定目标网站是否使用 HTTP/2

javascript - cfhttp 通过单击的链接传递 POST 变量?