IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

probleme Socket et InputStream


Sujet :

Entrée/Sortie Java

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2010
    Messages : 45
    Par défaut probleme Socket et InputStream
    Bonjour tout le monde, je vais essayer d'etre bref, j'essaie de faire un programme en Java de messagerie instantané qui ressemble a 80% a MSN,en utilisant les interface graphique Swing et AWT ainsi que les Socket TCP

    mon niveau en Java est intermediaire(je dirrai pas debutant ni expert quand meme)
    voila le plan de mon projet (je serai heureux de vos suggestion pour l'améliorer ) :

    - Serveur

    1 - a la connexion du Server,il affiche une fenetre JFrame qui contient une JList personalisé qui simule la liste des contacte, il se met en ecoute sur un port avec la ServerSocket.accept() avec un Thread pour lui permettre de faire autre chose que l'ecoute...
    dès la connexion d'un Client, j'instancie une classe ServerClient dont les attributs sont (Socket :retourné avec accept() et String Pseudo envoyé par le client quand il s'est connecté) et fait deux chose :
    Ajouter l'objet ServerClient a la JList du Server
    Envoyer le nouveau Client Client connecté a tous les Socket des ServerClient se trouvant sur cette JList (afin d'informer les clients déjà connecté de la connexion d'un nouveau membre).

    vu que le Serveur et le Client peuvent recevoir plusieurs données a un instant T, et ces données ont besoin d’être traité selon leur nature, j'ai jugé plus convenable de créer un Objet que je nommerai transmission qui contient deux attribut (String indicateur et Object donnée) , l'indicateur pour indiquer la nature de l'objet reçu afin de le traiter comme il se doit, et donnée ça peut être n'importe quoi (Vector, String, int, POJO), après des teste j'arrive un problème c'est que lors de la réception le Client n'est pas bloqué lors du "input.readObject()" et il continue sont chemin en boucle ce qui me génère pas mal d'Exception. Autre chose, j'aimerai gérer la fermeture des Socket lors de la déconnexion d'un client ou même du Serveur entier, pour plus d'information voila mon code teste , j'ai omis de mettre le projet principale avec les JFrame et tout car c'est beaucoup lourd (14 CLASS), j'ai crée un nouveau projet pour test :

    Dans ce test le client est en ecoute permanante avec le Thread monOperation, le Serveur quant a lui il envoi deux objet, une chaine String, et un Vector, le Client reçoit les deux et les traite comme il se doit, CEPENDANT il doit se remettre en écoute encore mais c'est pas le cas, MERCI d'avance les gars

    Class Client
    Code Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
     
    public class Client {	
    	public static void main(String[] args) throws Exception{
    		Socket socket = new Socket("localhost",12345);
    		// l'objet qur recevera les données
    		Transmission t = null;		
    		ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
    		// le Thread qui s'occupe de la reception et traitement selon la nature
    		monOperation Mo = new monOperation(input, t);		
    	}
    }
    Class Serveur
    Code Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    import java.io.ObjectOutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Vector;
    import javax.swing.JOptionPane;
     
    public class Serveur {	
    	public static void main(String[] args)throws Exception{		
    		ServerSocket serveur = new ServerSocket(12345);
    		Socket socket = serveur.accept();
    		ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());		
    		// saisir une donnée quelconque
    		String msg = JOptionPane.showInputDialog(null, "Ecrire votre Message : ");
    		Transmission t = new Transmission("Message", msg);
    		// envoyé la chaine saisi
    		output.writeObject(t);
    		output.flush();
    		// creation d'un vector pr tester
    		Vector x = new Vector();
    		x.add("Bonjour");
    		x.add(88);
     
    		t = new Transmission("Tableau", x);	
    		output.writeObject(t);		
    		output.flush();		
    		// je sais pas encore quand est ce que je dois fermer la Socket
    	}
    }
    Class Transmission : l'objet a transmettre
    Code Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    import java.io.Serializable;
    public class Transmission implements Serializable {
     
    	private static final long serialVersionUID = 1L;
    	private String indicateur;
    	private Object Donnee;
    	// Constructeur
    	public Transmission(String i,Object d){	indicateur = i;	Donnee = d;	}
    	// getter
    	public String getIndicateur() {	return indicateur;}
    	public Object getDonnee() {return Donnee;}
    	// setter
    	public void setIndicateur(String indicateur) {this.indicateur = indicateur;}
    	public void setDonnee(Object donnee) {Donnee = donnee;}	
     
    }
    class monOperation : Thread de reception permanante
    Code Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    import java.io.ObjectInputStream;
    import java.util.Vector;
     
     
    public class monOperation extends Thread{
     
    	private ObjectInputStream input;
    	private Transmission transmission;
     
    	public monOperation(ObjectInputStream i,Transmission t){
    		input = i;
    		transmission = t;
    		start();
    	}
     
    	public void run(){
    		try {
    			// on recuper l'objet  (c'est là où ça se bloque pas !!)
    			Transmission trans = (Transmission) input.readObject();
    			String indicateur = "";
    			// connaitre la nature de l'objet recu
    			indicateur = trans.getIndicateur();
     
    			if(indicateur.equals("Message")){
    				// traitement pour Message
    				String msg = (String) trans.getDonnee();
    				System.out.println("Recu du Serveur : "+ msg);
     
    			}else if(indicateur.equals("Tableau")){
    				// traitement pour les tableau
    				Vector x = (Vector) trans.getDonnee();
    				System.out.println("Recu du Serveur : "+ x);
     
    			}else{
    				// traitement par defaut si on reconnait pas 
    				System.out.println("Object non reconnu");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}		
    			// pour assurer la repetition du Thread (si vous avez d'autre suggestion n'hesitez pas)
    			new monOperation(input, transmission);
    	}
     
     
    }

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 117
    Par défaut
    Tu reinstancie un objet a chaque réception de message, ce qui n'est pas forcément le mieux. Dans ta méthode run pourquoi ne pas faire une boucle while?

    Au niveau algo, ca donnerais qqchose comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    while (isconnected) {
     msg = getMessage();
    //traitement du message
    //avec éventuellement un cas de message pour la déconnexion
     
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Système] probleme socket php
    Par sneb5757 dans le forum Langage
    Réponses: 3
    Dernier message: 03/06/2007, 11h27
  2. Probleme socket requete POST
    Par killuaster dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 15/10/2006, 15h15
  3. [Système] Probleme Socket Php
    Par Reaggaman dans le forum Langage
    Réponses: 4
    Dernier message: 01/03/2006, 18h55
  4. Problemes socket
    Par Proxius dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/07/2005, 14h25
  5. Probleme socket
    Par Spolix dans le forum Réseau
    Réponses: 6
    Dernier message: 03/10/2003, 06h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo