Transfert de données en java avec les socket

Résolu/Fermé
ajp55 Messages postés 426 Date d'inscription dimanche 31 juillet 2011 Statut Membre Dernière intervention 17 février 2015 - Modifié par ajp55 le 23/05/2012 à 14:00
ajp55 Messages postés 426 Date d'inscription dimanche 31 juillet 2011 Statut Membre Dernière intervention 17 février 2015 - 23 mai 2012 à 18:59
Bonjour,

Je suis entrain de développer un petit jeu en réseau en java. je vous explique mon problème.
j'ai contruit une interface permettant aux deux joueur de saisir leur numero de port, l'IPaddress et le numero de port de la machine distante.
J'ai d'abord transférer juste des textes,
socket de communication a été défini comme suit:
private Socket socket;  
 private BufferedReader entree; 
 private PrintStream sortie; 
entree = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    
sortie = new PrintStream(socket.getOutputStream()); 

quand je fais des entree.readLine(); et des sortie.println("blabla"); avec un button pour envoyer ce qui a ete ecrit, il ya bien communication
Par la suite, j'ai voulu y mettre des object (Etat de mon jeu) afin de les transferer par la socket.
le code correspondant est :
private Socket socket;  
 private ObjectInputStream entree; 
 private ObjectOutputStream sortie; 
entree = new ObjectInputStream(socket.getInputStream())); 
    
sortie = new ObjectOutputStream(socket.getOutputStream()); 

puis je fais un
sortie.writeObject(my_object)
mais il ya cette erreur : NoSerializableExeption sur la ligne
sortie.writeObject(my_object)

quelqu'un peut-il m'aider, je dois pouvoir envoyer et recevoir des données de la socket, pas simplement du texte.
Merci d'avance pour vos réponses
A voir également:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
23 mai 2012 à 14:03
Il faut que my_object soit sérialisable, c'est à dire que la classe qui la définit implémente java.io.Serializable, et implémente les trois méthodes de sérialisation writeObject, readObject et readObjectNoData comme détaillé dans la documentation.

Généralement ces méthodes consisteront à détailler les envois de chaque champ de ta classe avec leurs méthodes respectives (par exemple envoyer les String, les Integer...)
1
ajp55 Messages postés 426 Date d'inscription dimanche 31 juillet 2011 Statut Membre Dernière intervention 17 février 2015 23
Modifié par ajp55 le 23/05/2012 à 17:05
j'ai une classe
public class Data{ 
 private Cadre cadre; 
 private int player; 
 private String texte; 
 private int etat; 
 private Pion pion; 
} 
public class Cadre{ 
       private Pion[][] cadre; 
       private Color couleur; 
} 
public class Pion{ 
     private int column; 
    private int line; 
    private int color; 
} 

dit; comment je fait pour serializer avant envoyer tout un objet de type Data à l'autre joueur pour qu'il mette a jour son cadre des pion. c'est un jeux à deux. il s'agit du jeu Blocker.

dois-je définir la classe Data comme suit
public class Data implements Serializable{...}

et faire des writeObject() pour chacun des types String, int?
Merci
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
23 mai 2012 à 17:17
Il faudrait regarder en détail, mais en gros ce serait quelque chose comme ça :

public class Data implements Serializable
{
    private static final long serialVersionUID = 1;

    private void writeObject(java.io.ObjectOutputStream out) throws IOException
    {
        out.writeObject(cadre); // Attention Cadre doit également être Serializable
        out.writeInt(player);
        out.writeObject(texte);
        out.writeInt(etat);
        out.writeObject(pion); // Attention Pion doit également être Serializable
    }

    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
    {
        cadre=in.readObject(); // L'ordre doit coïncider avec celui de writeObject
        player=in.readInt();
        texte=in.readObject();
        etat=in.readInt();
        pion=in.readObject();
    }

    private void readObjectNoData() throws ObjectStreamException
    {
        throw new ObjectStreamException();
    }

    private Object writeReplace() throws ObjectStreamException
    {
        return this;
    }

    private Object readResolve() throws ObjectStreamException
    {
        return null;
    }
}
0
ajp55 Messages postés 426 Date d'inscription dimanche 31 juillet 2011 Statut Membre Dernière intervention 17 février 2015 23
23 mai 2012 à 18:59
cool KX, ça marche. Merci pour votre aide
0