#node.js
#node.js
Вопрос:
Мне интересно, имеет ли смысл использовать буфер узла для входящих клиентских данных на сервер. Мой сервер и клиенты основаны на TCP, и я использую <EOF>
их для определения конца сообщения. Сообщение всегда имеет формат JSON.
например: {"name":"Bob"}<EOF>
В случае, если все сообщение не проходит, должен ли я использовать буфер узла для создания данных или обычную строку?
Если это буфер, я не думаю, что понимаю, как правильно его создать. Это мой Client
конструктор, который создается каждый раз, когда сокет подключается к серверу узла.
constructor(socket){
var self = this;
// properties
this.socket = socket;
this.buffer = Buffer.alloc(1024);
this.dataEnd = '<EOF>';
// append <EOF> to every msg
this.socket.write = function(msg){
msg = "<EOF>";
return Socket.prototype.write.call(this, msg);
};
// build up buffer
this.socket.on('data', function(data){
var buffLen = self.buffer.length;
var dataBuffer = Buffer.from(data);
if(buffLen dataBuffer.length < 1024){
if(data.indexOf(self.dataEnd) === -1){
self.buffer.concat(dataBuffer);
}
}
});
return this;
}
Комментарии:
1. Буферы в основном предназначены для потоков двоичных данных, нет смысла использовать буфер для строки.
2. Ну, допустим, я запускаю сервер js узла и ожидаю, что от 100 до 1000 клиентов будут отправлять сообщения каждые несколько секунд между сервером и клиентом. Разве я не должен создавать там сообщения в буферах? Что сказать, что я получаю полное сообщение и т. Д.?
3. Есть ли проблема с вашим текущим кодом, с которой вам нужна помощь? (Это выглядит довольно разумно… если ваш вопрос просто «Можно ли использовать буфер для буферизации данных?» ответ «Да».)
4. Повторное чтение вопроса, я думаю, я не совсем понял. Вы используете дуплексные потоки TCP, которые сами по себе являются буферизацией и отправкой октетов. Вы читаете и записываете в поток, поэтому вы действительно не знаете, когда заканчивается сообщение, поэтому вы добавляете
<EOF>
в конец каждого сообщения. Когда вы получаете данные, вы не всегда получаете все сообщение за один раз, и вам нужно создавать его, пока не увидите a<EOF>
, чтобы вы знали, что сообщение завершено. Если да, то да, для этого можно использовать буферы.5. Да, это правильно. Но .. может быть, я просто спрашиваю — правильно ли я использую буферы? Я всегда создаю новый буфер и объединяю его со статическим. Я надеялся найти что-то более похожее на StringBuilder c #, где я мог бы просто нажать до конца буфера ..?