2010-10-26 2 views
2

Я пытаюсь отправить сообщения (байтовые массивы) из Node.js в Java через сокет TCP (сериализуется с protobuf).Отправка данных из Node.js в Java через TCP

создать сокет сервера на стороне 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. Сначала следует читать децитированные chunkds и затем десериализоваться как массивы байтов.

ответ

4

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