Enviando dados do Node.js para Java sobre TCP
-
26-09-2019 - |
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.
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);