У меня есть веб-сервер узла, который прослушивает
this.app.use('/register-receiver', (req, res) => {
const receiverId = req.query.id;
res.status(200).set({
connection: 'keep-alive',
'Cache-Control': 'no-cache',
'Content-Type': 'application/json',
});
this.receivers[receiverId] = res;
});
Он периодически отправляет полезную нагрузку JSON клиентам, подключенным к /register-receiver
с
this.receivers[receiverId].write(JSON.stringify({
// some big json
}))
У меня есть другая программа узла, котораядействует как клиент, который при подключении устанавливает соединение с сервером.
const options = {
agent: false,
host: <my host>,
defaultPort: <my port>
path: `/register-receiver?id=${activeConfig.receiver.id}`
headers: {
connection: 'keep-alive',
'Content-Type': 'application/json',
}
};
http.get(options, res => {
res.setEncoding('utf8');
res.on('data', data => {
try {
const response = JSON.parse(data);
// do stuff with response
} catch(e) {
console.log(`error ${e} with ${data}`);
}
});
res.on('end', () => console.log(`connection finished`) )
})
Сервер должен периодически отправлять полезные нагрузки JSON клиенту.Клиент должен получить эти JSON и что-то с ними сделать.Однако проблема заключается в том, что большие записи JSON разбиваются на части так, что клиент будет получать JSON по частям.Это нарушает JSON.parse(data)
, и теперь клиент не знает, как обрабатывать данные сервера.Я не могу полагаться на res.on('end')
, чтобы определить завершение фрагментированной записи, потому что это запрос поддержки активности, который должен оставаться открытым всегда.
Я хочу избежать разработки собственного протокола для объединения фрагментов JSONиз-за его сложности.Это не так просто, как объединение строк, поскольку я мог бы чередовать фрагменты JSON, если сервер отправляет 2 большие полезные нагрузки JSON одновременно.
Можно ли заставить сервер записать весь JSON как 1 блок впоток?Как я могу настроить мой клиент так, чтобы он устанавливал «навсегда» соединение с моим сервером и слушал полные полезные нагрузки JSON?