Salut à tous,
J'ai des objets de type Message (Serializable), et je cherche à les serializer/déserializer dans des ByteBuffer afin de les envoyer au travers de SocketChannel... Est-ce que qqn sait comment procéder ?
Merci de votre aide
Salut à tous,
J'ai des objets de type Message (Serializable), et je cherche à les serializer/déserializer dans des ByteBuffer afin de les envoyer au travers de SocketChannel... Est-ce que qqn sait comment procéder ?
Merci de votre aide
Peut-être en passant par des ByteArrayOutputStream / ByteArrayInputStream.
Tu devrait utiliser un ObjectInputStream et ObjectOutPutStream comme flux de donner et tu connect ces flux à ceux de ta soket...
Cela te permet de faire directement un readObject() et writeObject() sur ces flux puis de caster les objet reçu afin de recupere l'ensemble des objets que tu fais transiter sur le reseau
++
En fait j'utilise justement les SocketChannel en mode non bloquant je peux donc pas utiliser le socket associé héhé...Envoyé par guis14
Merci y@m's, je vais jeter un oeil...
J'ai beau regarder, je vois pas comment intégrer ces ByteArrayOutputStream / ByteArrayInputStream dans mon programme, la classe SocketChannel ne fournit aucune méthode pour obtenir des streams...
Pour schématiser un peu ma pensé :
Sérialisation ObjectOutputStream ByteArrayOutputStream byte[] ByteBuffer écriture dans SocketChannel
Lecture depuis SocketChannel ByteBuffer byte[] ByteArrayInputStream ObjectInputStream désérialisation
Après j'avoue ne pas très bien connaître le package nio , il y a peut-être plus simple.
Je vois ce que tu veux dire, je vois juste pas très bien les étapes :
Sérialisation -> ObjectOutputStream
et ObjectInputStream -> désérialisation
En clair je vois pas comment obtenir un ObjectOutputStream à partir d'une de mes instance d'objet, et vice-versa...
C'était juste pour signalé que pour la sérialisation il faut utiliser un ObjectOutputStream et pour la désérialisation il faut un ObjectInputStream .
ben oui, mais je vois pas comment obtenir d'ObjectOutpuStream à partir de mon objet
Tu n'obtient pas l'ObjectOutputStream à partir de ton objet mais a partir d'un OutPutStream que tu doit récupérer depuis ta Socket ou ta SocketChannel
Hé bien à vrai dire c'est exactement ce que je voulais faire avant, avec un code du genre :
mais ça ne marche absolument pas, parce que ma socketChannel est en mode non-bloquant, et je crois que le seul moyen d'écrire qqch dessus est d'utiliser la méthode SocketChannel.write(ByteBuffer).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Socket socket = socketChannel.socket(); ObjectOutputStream dos = new ObjectOutputStream(socket.getOutputStream()); dos.writeObject(message); dos.close();
la classe SocketChannel ne fournit aucune méthode qui renvoie un stream quelconque. J'en déduit que le seul moyen que j'ai, c'est de fabriquer un objet ByteBuffer à partir de mon objet. Je crois vraiment que c'est possible, je trouve juste pas comment
Apparement tu n'as pas bien compris ce que je voulais dire (mais j'avoue ne pas avoir été très explicite).Envoyé par ratakses
Tu as ton objet à sérialiser. La sérialisation se fait vers un flux ObjectOutputStream :or tu veux un byte[].
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ObjectOutputStream out = ...; out.writeObject(monObjet);
Pour ce faire il faut utilise un ByteArrayOutputStream sur lequel on mappe l'ObjectOutputStream dans lequel on sérialise l'objet. Une fois l'objet sérialisé, on récupère le byte[] via le ByteArrayOutputStream :
Tu as donc maintenant un byte[] contenant l'objet sérialisé, il ne te reste plus qu'à créer un ByteBuffer avec ce byte[] et l'envoyer dans le SocketChannel .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos); out.writeObject(); out.flush; byte[] data = bos.toByteArray();
En espérant avoir été plus clair.
PS : attention, je ne gère aucune erreur dans ces exemples.
Je pense qu'il faut que tu creer ton objextOutputStream a partir de ton ByteArrayOutputStream que tu cré a partir de ton byte[] que tu creer a partir de ton byteBuffer qui vient de ta socketChannel que tu recupère avec client.read()...
Ha la je vois beaucoup mieux, du coup !
Merci pour ton aide, je vais essayer ça.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager