#javascript #node.js #sockets
#javascript #node.js #сокеты
Вопрос:
Сокеты, в отличие от HTTP, не имеют ничего, что всегда req, res
похоже:
client.on('data', function(data)...
Событие выполняется, когда в потоке есть данные.
Теперь я хочу установить связь между сервером и сервером. Я пишу игру, в которой у меня будет главный сервер, и этот главный сервер взаимодействует с настольным клиентом игр.
Один сервер является мировым сервером, а другой — сервером входа. Клиент напрямую подключается к мировому серверу, и если данные являются данными для входа, то мировой сервер передает их на сервер входа.
Но я не могу понять, как это сделать в node. В качестве предыдущего webdev я могу думать только о:
login.send(dataToSendToOtherServer, function(responseOfOtherServer) {
if (responseOfOtherServer === 1)
client.write(thisDataIsGoingToTheDesktopClient)
})
Итак, как я могу сделать что-то подобное для сокетов в node.js ?
Я попробовал что-то вроде:
Client.prototype.send = function(data, cb) {
// convert json to string
var obj = JSON.stringify(data)
this.client.write(obj)
// wait for the response of this request
this.client.on('data', function(req) {
var request = JSON.parse(req)
// return response as callback
if (data.type === request.type) cb(request)
})
}
Но при этом на каждый запрос ответ получает 1.
Ответ №1:
Поскольку вы имеете дело с обычным TCP / IP, вам нужно придумать свой собственный протокол более высокого уровня, чтобы указать такие вещи, как определение завершения сообщения (поскольку TCP не дает гарантии, что все это поступит одним глотком). Распространенные способы решения этой проблемы:
- Сообщения фиксированной длины: буферизуйте полученные данные до тех пор, пока они не станут нужной длины.
- Добавление к каждому сообщению префикса длины: буферизуйте полученные данные до тех пор, пока не будет достигнута указанная длина.
- Назначение некоторого символа или последовательности в качестве индикатора окончания сообщения: буферизуйте полученные данные, пока они не закончатся этой последовательностью / символом.
В вашем случае вы можете буферизировать полученные данные до JSON.parse
тех пор, пока накопленные данные не будут успешно обработаны, предполагая, что каждое сообщение состоит из юридического JSON.
Комментарии:
1. Да, мои пакеты имеют общую длину пакета в первом байте. Что я могу с этим сделать сейчас?
2. На самом деле часть json — это просто пример. Мои реальные данные — это буфер. Protobuf.
3. Или вы думаете, что что-то вроде RPC или очереди, в которой все серверы считывают данные из очереди, является лучшим способом связи между ними? Я только что нашел их во время поиска, хотя я никогда не пробовал их и не знаком с ними.