Pergunta

Estou tentando enviar mensagens (matrizes de byte) do Node.js para Java via soquete TCP (serializado com o Protobuf).

Eu crio um soquete de servidor no lado Java e conecto -me a ele do nó:

var client = net.createConnection(12345, "localhost")

client.addListener("connect", function(){
    client.write(serializedMsg1)
    client.end(serializedMsg2)
})

No lado do Java, estou buscando o conteúdo do fluxo de entrada e a deseralizando:

Protocol1.parseFrom(inputStream);
Protocol2.parseFrom(inputStream);

O problema está seguindo - parece apenas serializedMsg2 é aprovado/desaperializado, enquanto serializedMsg1 é ignorado. Pelo que entendi, isso acontece, porque o fluxo de bytes não é delimitado e o tamanho dos pedaços de dados deve ser especificado explicitamente. Os dados não devem ser lidos diretamente do fluxo do lado Java - os pedaços delimitados devem ser lidos primeiro e serializados como matrizes de bytes posteriormente.

Foi útil?

Solução

Você pode usar Buffer Para passar o tamanho da folha de dados que você está escrevendo para o fluxo:

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)

No lado Java:

int size = inputStream.readInt();
byte[] result = new byte[size];
inputStream.read(byteArray);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top