2 votes

Envoi de données de Node.js à Java via TCP

J'essaie d'envoyer des messages (tableaux d'octets) de Node.js à Java via un socket TCP (sérialisé avec protobuf).

Je crée un socket serveur du côté java, et je m'y connecte à partir de Node :

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

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

Du côté Java, je récupère le contenu du flux d'entrée et le désérialise :

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

Le problème est le suivant - il semble que seulement serializedMsg2 est transmis/désérialisé, tandis que serializedMsg1 est ignorée. D'après ce que je comprends, cela se produit parce que le flux d'octets n'est pas délimité et que la taille des morceaux de données doit être spécifiée explicitement. Les données ne doivent pas être lues directement à partir du flux côté Java - les morceaux délimités doivent être lus en premier, puis désérialisés sous forme de tableaux d'octets.

5voto

Vasil Remeniuk Points 12487

Vous pouvez utiliser Buffer afin de transmettre la taille du bloc de données que vous écrivez dans le flux :

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)

Du côté de Java :

int size = inputStream.readInt();
byte[] result = new byte[size];
inputStream.read(byteArray);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X