#java #tcp #node.js #protocol-buffers
#java #tcp #node.js #буферы протокола
Вопрос:
Я пытаюсь отправлять сообщения (массивы байтов) из Node.js в Java через сокет TCP (сериализованный с помощью protobuf).
Я создаю серверный сокет на стороне Java и подключаюсь к нему с узла:
var client = net.createConnection(12345, "localhost")
client.addListener("connect", function(){
client.write(serializedMsg1)
client.end(serializedMsg2)
})
На стороне java я извлекаю содержимое из входного потока и десериализую его:
Protocol1.parseFrom(inputStream);
Protocol2.parseFrom(inputStream);
Проблема заключается в следующем — похоже, что передается / десериализуется только serializedMsg2
, в то время как serializedMsg1
игнорируется. Как я понимаю, это происходит из-за того, что поток байтов не разделен, а размер блоков данных должен быть указан явно. Данные не должны считываться непосредственно из потока на стороне java — сначала следует считывать чанки с разделителями, а затем десериализовывать в виде массивов байтов.
Ответ №1:
Вы можете использовать Buffer
для передачи размера блока данных, который вы записываете, в поток:
function writeInt(stream, int){
var bytes = new Array(4)
bytes[0] = int >> 24
bytes[1] = int >> 16
bytes[2] = int >> 8
bytes[3] = int
stream.write(new Buffer(bytes))
}
...
writeInt(client, data.length)
client.write(data)
На стороне Java:
int size = inputStream.readInt();
byte[] result = new byte[size];
inputStream.read(byteArray);
Комментарии:
1. Не могли бы вы добавить пример
C#
readInt()? Это было бы очень любезно с вашей стороны!