Отправка данных с Node.js в Java по протоколу TCP

#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()? Это было бы очень любезно с вашей стороны!