Comment echanger un "objet" entre un client et un serveur

Comment echanger un "objet" entre un client et un serveur - Java - Programmation

Marsh Posté le 03-12-2006 à 17:27:18    

Bonsoir à tous !  
voilà je développe en ce moement un jeu en Java et je dois le mettre en réseau !  
 
Le pb qui e pose est "comment echanger un objet (l'état du jeu à un moment donnée) entre un client et un serveur.
J'ai réussi à echanger des données ente un client et un serveur avec DataXXXStream et XXXStream mais ces 4 classes n'offrent pas la possiblité d'échanger des objet java (enfin je pense). on jeux juste echanger des données de type primitif.
 
J'ai essayé d'utiliser sles classes ObjectXXXStream mais le client et le serveur bloquent quand je fait par exemple :
ObjectInputStream canalLecture = new ObjectInputStream(socketClient.getInputStream()) ;
 
Voilà ! si qqn peux m'aider pour résoudre ce pb !
Merci à tous et Bonne fin de journée !
@ +

Reply

Marsh Posté le 03-12-2006 à 17:27:18   

Reply

Marsh Posté le 03-12-2006 à 17:39:43    

T'a essayé de serialiser l'objet avant de l'envoyer?
 
Parcontre je vois pas trop le but de ce que tu veux faire


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 03-12-2006 à 17:42:42    

Oui ! pour la sérialisation j'ai essayé de faire ça mais ça n'a pas marché.
 
Ce que je veux faire c'est echanger une structure de donnée complexe entre un client et un serveur ( je veux echanger la configuration du jeu). si j'arrive à faire ça ! je crée un serveur qui pourra mettre en relation deux clients (donc deux joueurs) pour qu'ils puissent jouer en reseau au jeu que je suis en train de développer.
Merci

Reply

Marsh Posté le 03-12-2006 à 17:47:58    

Voici le code du client :
 
..........................................................
package client02;
 
import java.io.*;
import java.net.*;
 
public class Client implements Serializable{
 /**
  *  
  */
 private static final long serialVersionUID = 1L;
 protected static final int PORT=4555 ;
 
 public static void main(String[] args) {
  Socket socketClient = null;
  try {
   // creation de la socket client avec l'adresse du serveur et le numero  
   // du port .
   socketClient = new Socket(args[0], PORT) ;
 
   //création d'un canal pour lire les données de la socket.
   
   ObjectInputStream canalLecture = new ObjectInputStream(socketClient.getInputStream()) ;
   System.out.println("ca bloque" );
   //création d'un canal pour lire les données de la console .
   DataInputStream console = new DataInputStream(System.in) ;
 
   // création d'un canal pour afficher les données.
 
   ObjectOutputStream canalEcriture = new ObjectOutputStream(socketClient.getOutputStream()) ;
 
   // confirmer l'établissement d'une connexion .
   if(socketClient.isConnected())
    System.out.println("Connection établie: "+socketClient.getInetAddress()+" port: "+socketClient.getPort());
 
   //récupérer des lignes du serveur et les afficher sur la console.
   int entier;
   
   while(true) {
    for(int i=10;i<100;i++){
     console.readLine();
     canalEcriture.write(i);
     entier=canalLecture.read();
     System.out.println(entier);
    }
     
   }
  }
  catch(Exception e) {e.printStackTrace();}
 }
}
..........................................................
 
mais ça bloque à la ligne :
ObjectInputStream canalLecture = new ObjectInputStream(socketClient.getInputStream()) ;  
 

Reply

Marsh Posté le 04-12-2006 à 09:19:46    

Alors ? personne ne vois comme tn i faut faire ? :non:

Reply

Marsh Posté le 04-12-2006 à 18:06:09    

tu as pensé à utiliser RMI?
 
ça pourrait être beaucoup plus simple (d'une certaine manière :D)

Reply

Marsh Posté le 05-12-2006 à 12:18:45    

c bon ! j'ai une reponse au pb ! c bete en fait : il falait juste faire :
protected ObjectOutputStream canalSortie;
protected ObjectInputStream canalEntree;
 
Puis mettre :
canalSortie=new ObjectOutputStream(laSocketClient.getOutputStream());
canalEntree=new ObjectInputStream(laSocketClient.getInputStream());
 
Au lieu de :  
canalEntree=new ObjectInputStream(laSocketClient.getInputStream());
canalSortie=new ObjectOutputStream(laSocketClient.getOutputStream());
qui provoque soit une exception de type : StreamCorruptedException
 ou fait que l'exécution bloque à la ligne :
canalEntree=new ObjectInputStream(laSocketClient.getInputStream());
 
Merci pour pour tout les gens qui ont essayé de m'aider !
Slt !

Reply

Marsh Posté le 06-12-2006 à 12:44:06    

problème d'autoblocage??
il essaye de lire quelque chose qui vient du réseau alors qu erien n'arrive??
 
Toujours auvrir le flux de sortie (ecriture ) d'abords :)
surtout quand tu travail sur le réseau (c'est bloquant)

Reply

Marsh Posté le 09-12-2006 à 22:26:45    

Oui ! mais c'étais pas ça le pb ! j'essayais pas de lire des données du reseau le pb c'est que il fallais asigné un flux de sortie à la socket avant le flux d'entrée ! c'et une bizarerie de Java ! c'est ce que mon prof de java m'a dis ! sinon ! c'est bon j'ai terminé "mon application réseau" et j'ai rendu le rapport de mon projet ! mais pour l'instant il ne supporte que deux clients ! il attends que deux clients se connectent puis ils les mis en relation. Je vais essayer d'étendre ça après les exams !  
 
mais ce que je sais pas comment faire  c'est comment lancer le serveur du jeu sur mon site internet ! c'est possible de faire ça ??
 
Merci beaucoup !
à plus

Reply

Marsh Posté le 10-12-2006 à 10:37:39    

une bizzarerie de JAVA. lol
ce n'est pas bizzare mais logique...  
pour ce qui est via ton site web, laisse tombé pour passer avec http. Soit tu recrées un serveur direct toi même soit tu passes par des web services...

Reply

Marsh Posté le 10-12-2006 à 10:37:39   

Reply

Marsh Posté le 11-12-2006 à 09:59:56    

moi23372 +1
 
ce n'est aps bizzard: il essaye de lire l'entrée de la socket, et il attends quelque chose. Tant qu'il n'a rien reçu il ne passe pas à la ligne suivante.
 
si tu veux pouvoir avoir plus de deux client, il va falloir que tu passes par des Threads

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed