Envoyer et recevoir l'objet serialize sur UDP
J'essaie d'envoyer un objet sérialisé à partir d'un serveur de processus d'un processus client en Java en utilisant UDP. Le problème est que le client est bloqué sur la méthode de réception. Quelqu'un peut-il aider?!
voici le code du serveur pour l'envoi de l'objet:
ClientModel C1= new ClientModel(100,"Noor","Noor",38,38,"asd");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(C1);
oos.flush();
byte[] Buf= baos.toByteArray();
packet = new DatagramPacket(Buf, Buf.length, client, port);
socket.send(packet);
et voici le code client pour la réception de l'objet:
byte[] buffer = new byte[100000];
packet = new DatagramPacket(buffer, buffer.length );
socket.receive(packet);
System.out.println("packet received");
Je veux juste recevoir l'objet à être en mesure de reconstituer, mais je ne peut pas recevoir le paquet lui-même.
source d'informationauteur Noor
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas ce que vous voulez accomplir en fin de compte, mais le fait de travailler avec UDP n'est pas si facile... la principale raison en est dans la Description de la DatagramPacket Objet:
Un bon tutoriel lorsque vous travaillez avec udp est http://download.oracle.com/javase/tutorial/networking/datagrams/clientServer.html
Au sujet de votre blocage:
Je n'ai pas vraiment testé, mais je suis assez sûr - sur la base de la description que le datagramsocket.reseive fonction de bloc jusqu'à ce que le paquet est rempli (dans votre cas, jusqu'à 100000 octets reçus).
Je vous suggère de commencer avec un datagrampacket avec un fixe de longueur connue, où vous transmettre la taille de la charge utile. Quelque chose comme:
De l'autre côté, vous SAVEZ maintenant vos tailles:
La CientModel clas sI utilisé:
J'ai testé ce code et il fonctionne très bien. Espérons que l'aide (j'ai eu l'octet de type int et autour de http://www.tutorials.de/java/228129-konvertierung-von-integer-byte-array.html)
Edit: Comme indiqué dans les commentaires, il est souvent une très mauvaise idée d'utiliser UDP, principalement, parce que vous ne savez pas si vos paquets sont reçus dans l'ordre correct, ou même pas du tout. UDP ne garantit PAS que. Je ne voulais pas faire trop de udp de programmation, mais la seule partie que vous pouvez compter sur (si j'ai bien compris), c'est, que si vous obtenez un paquet et il s'inscrit dans le datagramme (65,527 octets - voir https://en.wikipedia.org/wiki/User_Datagram_Protocol) il contiendra l'ensemble de la chose. Donc, si vous ne vous souciez pas de l'ordre dans lequel le message venu et votre objet s'inscrit dans le datagramme, vous devriez être bien.
Edit2: Comme pour le code: ne pas utiliser en tant que tel. c'est seulement un exemple, ind UDP vous devez avoir un seul type de paquet, et ce avec une taille connue. de cette façon, vous n'avez pas besoin d'envoyer la "taille". Si vous utilisez le code comme indiqué ci-dessus, et un paquet est perdu, le paquet suivant sera de la bonne taille (c'est à dire le premier paquet est supprimé, tout à coup vous de vérifier les premiers octets de la charge utile pour obtenir la taille).
Ce qui est faux. La fonction de réception bloquera jusqu'à ce qu'un datagramme est reçu, ce qui peut être plus petite que la taille de la mémoire tampon (et en général). La méthode de paquet.getLength() vous dira combien grand qu'il était.