Question

Je travaille sur une mission de programmation réseau sur l'écriture d'un simple système de messagerie instantanée (un peu comme la version la plus simple de Windows Messenger).

la spécification précise que je dois envoyer plus de 4 champs de données dans un seul paquet de datagrammes, ce sont:

To From Type Message
where type refers to message type, implemented as a user defined enum class.

Je voudrais être enseigné comment emballer toutes ces données dans un seul paquet.

MISE À JOUR: thx pour l'aide à ce jour, mais dire que j'ai phrase et Chaîne De la façon normale de patcher le paquet individuellement serait

byte[] sendData = new byte [256]
sendData = sentence.getBytes();

mais comment exactement puis-je ajouter le « de » chaîne à sendData ainsi que la chaîne de phrase?

Était-ce utile?

La solution

En bref, ce que vous devez faire est:

  1. créer un objet (classe) qui contient vos 4 champs (de / à / ENUM / message)
  2. serialise cela. Il doit mettre en œuvre Serializable. Voir d'autres solutions ici pour savoir comment serialise
  3. convertir en un tableau d'octets et envoyer sur le socket (voir ailleurs pour plus de détails)

À l'autre extrémité vous lirai bytestream, deserialise et de le jeter à une instance de votre classe définie dans 1 ci-dessus.

En créant l'un objet contenant les 4 champs et sérialisation cet objet, ce qui vous permet d'envoyer les quatre champs ensemble (j'ai l'impression que c'est la pierre d'achoppement?).

Notez que les datagrammes auront des limites de taille imposées par les couches de transport de réseau, mais pour cette application je soupçonne que ce n'est pas un problème.

Autres conseils

Vous pouvez envoyer utiliser quelque chose comme un objet Serializable cela.

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(buffer);
out.writeObject(objectYouWantToSend);
out.close();
buffer.close();
DatagramPacket packet = new 
    DatagramPacket(buffer.toByteArray(), 
                   buffer.size(), 
                   InetAddress.getByName(...),
                   portNumber);
socket.send(packet);

Vous donnez-les simplement avant de les transmettre à l'interface réseau. Quelque chose le long des lignes de:

byte[] buff = new byte[256];
// Add al your fields here to buff.
DatagramPacket packet = new DatagramPacket(buff, buff.length, address, 1234);
socket.send(packet);

Si elles ne sont pas toutes les chaînes, vous aurez besoin de les encoder en tant que tels.

Il y a beaucoup d'options pour le codage des données, tous viennent vers le bas pour mettre les quatre champs dans une structure de données, puis envoyer que tout en une seule fois.

La partie importante est que le codage doit montrer lequel des quatre champs est à quel point dans le paquet, sinon l'extrémité ne sera pas en mesure de le décoder de manière fiable.

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