2009-04-18 8 views
1

Je travaille sur une tâche de programmation réseau sur l'écriture d'un système de messagerie instantanée simple (à peu près comme la version la plus simple de Windows Messenger).Envoyer plusieurs données dans un seul datagramme UDP

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 avec la chaîne de phrase?

Répondre

2

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. converti à un tableau d'octets et envoyer sur le socket (voir ailleurs pour plus de détails)

À l'autre extrémité, vous lirez ces lignes bytestream, deserialise et jette un instance de votre classe définie au point 1. ci-dessus.

En créant un objet contenant les 4 champs et en sérialisant cet objet, cela vous permet d'envoyer tous 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 réseau, mais pour cette application, je suppose que ce n'est pas un problème.

1

Vous les ajoutez 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 tel.

+0

Bien que cela puisse être simple, sans délimiteurs, il peut être difficile de retourner le champ unique dans les quatre champs d'origine ... – Alnitak

+0

Ou champs de longueur fixe. J'ai supposé que cela serait couvert par la spécification mentionnée. L'insertion et l'extraction réelles dépendent de cette spécification. Si plus d'informations sont nécessaires, elles devront être fournies. – paxdiablo

+0

ce commentaire a été écrit juste avant que vous ne passiez à un tableau d'octets alors que vous n'aviez que quatre chaînes concaténées. Cela reste vrai, cependant ... – Alnitak

0

Il existe de nombreuses options pour coder les données, qui consistent toutes à mettre les quatre champs dans une structure de données, puis à les envoyer en une fois.

La partie importante est que les besoins d'encodage pour montrer lequel des quatre champs est à quel point dans le paquet, sinon l'extrémité éloignée ne sera pas capable de le décoder de manière fiable.

+0

Pour les devoirs à ce niveau débutant, j'utiliserais des structures de données assez simples telles que la longueur fixe ou un simple délimiteur. Vous serez presque certainement signalé comme un plagiaire/tricheur potentiel si vous arrivez avec une solution compliquée comme le XML ou la sérialisation. – paxdiablo

+0

yep - J'ai tout d'abord mis le bricolage :) – Alnitak

+0

Oh, je vois, au début, j'ai juste supposé que c'était un nouvel acronyme dont je n'avais pas encore entendu parler (tant de choses flottent autour). Je viens de réaliser que c'était le vieux bricolage préféré :-) – paxdiablo

3

Vous pouvez envoyer n'importe quel objet Serializable en utilisant quelque chose comme ceci.

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); 
+0

comment désertiez-vous cela à l'autre bout? Je veux dire, autant que je sache (je commence avec Java), vous devez passer un DatagramPacket (créé avec un tampon de taille fixe) à la méthode de réception, comment "devinez" cette taille? Merci. –

+0

envoyez-vous d'énormes quantités de données sur UDP? Notez que certains paquets peuvent ne pas être livrés ou qu'ils peuvent arriver dans un ordre différent. Je crois que l'idée ici est de convenir d'une longueur fixe des paquets de datagramme envoyés et reçus, par ex. 4K morceaux ou même moins, et alors vous n'avez pas à deviner. Juste allouer 4K au message entrant, recevoir() dans ce paquet alloué, et aller de là. Si vous craignez que l'objet envoyé ait une taille supérieure à 4 Ko, vous devriez probablement envisager d'utiliser un socket TCP. –

+0

merci pour votre réponse Peter –