Requête TCP multi-bits en Java
-
13-12-2019 - |
Question
J'essaie de faire une requête TCP en Java vers un serveur TCP existant déjà disponible.la spécification de l'interface est :
Field Length Type
Length 2 bytes 16-bits binary
Message ID 1 byte 8-bits binary
MSGTYPE 1 byte 8-bits binary
Variable1 4 bytes 32-bits binary
Variable2 30 bytes ASCII
Variable3 1 byte 8-bits binary
Je comprends comment convertir une chaîne en binaire à l'aide de BigInteger.
String testing = "Test Binary";
byte[] bytes = testing.getBytes();
BigInteger bi = new BigInteger(bytes);
System.out.println(bi.toString(2));
Je crois comprendre que si je voulais faire une requête TCP, je le ferais d'abord
- besoin de convertir chaque binaire en chaîne
- ajoutez les valeurs à un StringBuffer.
Malheureusement, ma compréhension est limitée, je voulais donc des conseils pour créer correctement la requête TCP.
La solution
Je n'utiliserais pas String (car vous avez des données binaires), StringBuffer (jamais) ou BigInteger (car ce n'est pas pour cela qu'il est conçu).
En supposant que vous disposez d'un flux de données Big Endian, j'utiliserais DataOutputStream
DataOutptuStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
out.writeShort(length);
out.write(messageId);
out.write(msgtype);
out.write((var1+"\0\0\0\0").substring(0, 4).getBytes("ISO-8859-1"));
out.write(var2.getBytes("ISO-8859-1"));
out.write(var2);
out.flush(); // optionally.
Si vous avez un petit protocole endian, vous devez utiliser ByteBuffer, auquel cas j'utiliserais un NIO SocketChannel bloquant.
BTW, j'utiliserais ISO-8859-1
(octets de 8 bits) plutôt que US-ASCII
(octets de 7 bits)
Autres conseils
Vous allez dans la mauvaise direction.Le fait que la spécification du message indique que, par exemple, le premier champ est un binaire de 16 bits ne signifie pas que vous enverrez une chaîne binaire.Vous enverrez simplement un nombre (non signé ?) de 16 bits qui sera, en fait, codifié en binaire puisque sa représentation interne peut simplement être celle-là.
Lors de l'écriture sur un socket via un DataOutputStream
comme dans
int value = 123456;
out.writeInt(value);
vous l'écrivez déjà en binaire.