Отправка данных из Node.js в Java через TCP - PullRequest
2 голосов
/ 26 октября 2010

Я пытаюсь отправлять сообщения (байтовые массивы) из 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 Ответ

4 голосов
/ 26 октября 2010

Вы можете использовать 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);
...