Transfert de données en java avec les socket [Résolu/Fermé]

Signaler
Messages postés
426
Date d'inscription
dimanche 31 juillet 2011
Statut
Membre
Dernière intervention
17 février 2015
-
Messages postés
426
Date d'inscription
dimanche 31 juillet 2011
Statut
Membre
Dernière intervention
17 février 2015
-
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

1 réponse

Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 856
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
426
Date d'inscription
dimanche 31 juillet 2011
Statut
Membre
Dernière intervention
17 février 2015
22
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
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 856
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;
    }
}
Messages postés
426
Date d'inscription
dimanche 31 juillet 2011
Statut
Membre
Dernière intervention
17 février 2015
22
cool KX, ça marche. Merci pour votre aide