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

  1. besoin de convertir chaque binaire en chaîne
  2. 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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top