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 :

client et socket


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut client et socket
    Bonjour,

    Je suis en exam (internet autorisée) mais j'ai un petit souci:
    ma classe main doit créer 4 instances de ma classe Client ainsi qu'un socket de communication vers le serveur.
    Jusque là ça va.
    Mais il faut que ce socket soit partagé par tous les clients et ne doit être accédé à un même moment que par un client à la fois.

    Voici mon code:
    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
    48
    49
    50
    51
    	public static void main(String[] args) {
     
    		Client clt1=new Client();
    		Client clt2=new Client();
    		Client clt3=new Client();
    		Client clt4=new Client();
     
    		// TODO Auto-generated method stub
    		try
    		{
    			Socket s = new Socket("localhost", portServeur);
    			InputStream is = s.getInputStream();
    			OutputStream os = s.getOutputStream();
    			BufferedReader br = new BufferedReader(new InputStreamReader(is));
    			//DataOutputStream dos = new DataOutputStream(os);
    			PrintWriter pw = new PrintWriter(os, true);
    			BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
    			String chaine = (String)null;
     
     
     
    		//Lecture d'une chaîne au clavier
    		System.out.println("[Client] Saisissez une chaîne de caractères : ");
    		chaine = keyboard.readLine();
     
    		//Envoi de la chaîne au serveur
    		//dos.writeChars(chaine);
    		//dos.flush();
    		pw.println(chaine);
    		pw.flush();
    		os.flush();
     
    		//Affichage de la chaîne reçue en retour
    		System.out.println("[Client] chaîne reçue : " + br.readLine());
     
    		//Fermeture des flux
    		keyboard.close();
    		//dos.close();
    		pw.close();
    		br.close();
    		os.close();
    		is.close();
    	}
    	catch (Exception e)
    	{
    		System.err.println("Erreur du client.");
    		e.printStackTrace(System.err);
    	}
     
    }
    }
    Pour que la socket soit partagé, je pensais mettre cette socket dans la classe client et utiliser les threads.
    Qu'en pensez-vous?

    merci d'avance
    claire

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    salut,

    en déportant tes fonction d'écriture sur la socket client dans une fonction que tu mettras en 'synchronized', ça devrait t'assurer que quels que soit le nombre de threads que tu as, il n'y en aura qu'un seul qui écrira en-même temps sur la socket serveur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public synchronized writeToSocket(String chaine) {
    	pw.println(chaine);
    	pw.flush();
    	os.flush();
    }
    PS: un exam avec internet autorisé ? Tu étudies ou ?!

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    merci voilà ce que ça donne côté client:

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    public static Socket s;
    	public synchronized static void writeToSocket(String chaine) {
     
    		OutputStream os = null;
    		try {
    			os = s.getOutputStream();
     
    		PrintWriter pw = new PrintWriter(os, true);
    		pw.println(chaine);
    		pw.flush();
     
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		}
    	/**
             * @param args
             */
    	public static void main(String[] args) {
     
    		Client clt1=new Client(1);
    		Client clt2=new Client(2);
    		Client clt3=new Client(3);
    		Client clt4=new Client(4);
     
    		// TODO Auto-generated method stub
    		try
    		{
    			Socket s = new Socket("localhost", portServeur);
    			InputStream is = s.getInputStream();
    			OutputStream os = s.getOutputStream();
    			BufferedReader br = new BufferedReader(new InputStreamReader(is));
     
    			String chaine = (String)null;
     
     
     
     
    			chaine=clt2.setSauvegarde();
    			System.out.println(chaine);
    			Main.writeToSocket(clt1.setSauvegarde());
    			Main.writeToSocket(clt2.setSauvegarde());
    			Main.writeToSocket(clt3.setSauvegarde());
    			Main.writeToSocket(clt4.setSauvegarde());
     
    		os.flush();
     
    		//Affichage de la chaîne reçue en retour
    		System.out.println("[Client] chaîne reçue : " + chaine);
     
    		//Fermeture des flux
    		//keyboard.close();
    		//dos.close();
    		//pw.close();
    		br.close();
    		os.close();
    		is.close();
    	}
    	catch (Exception e)
    	{
    		System.err.println("Erreur du client.");
    		e.printStackTrace(System.err);
    	}
     
     
    }
    }
    et du côté serveur:

    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
    48
    49
    50
    51
     
     
    try
    		{
    			ServerSocket ecoute = new ServerSocket(portServeur);
    			Socket s = (Socket)null;
    			boolean arret = false;
     
    			while (arret == false)
    			{
    				System.out.println("[Serveur] En attente de connexion d'un client...");
    				s = ecoute.accept();
    				System.out.println("Connexion acceptée.");
     
    				InputStream is = s.getInputStream();
    				OutputStream os = s.getOutputStream();
    				BufferedReader br = new BufferedReader(new InputStreamReader(is));
     
    				PrintWriter pw = new PrintWriter(os, true);
    				BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
    				String chaine = (String)null;
    				String recue = (String)null;
     
    				//Affichage de la chaîne reçue
    				recue = br.readLine();
    				System.out.println("[Serveur] Chaîne reçue du client : " + recue);
     
    				//sauvegarde de la chaîne comportant l'heure courante et l'id du client
     
    				FileOutputStream fos = new FileOutputStream("sauvegarde.txt");
    				ObjectOutputStream oos=new ObjectOutputStream(fos);
    				oos.writeObject(recue);
    				oos.close();
     
     
    				//Fermeture des flux
    				keyboard.close();
     
    				pw.close();
    				br.close();
    				os.close();
    				is.close();
    				arret = true;
    			}
    		}
    		catch (Exception e)
    		{
    			System.err.println("Erreur du serveur.");
    			e.printStackTrace(System.err);
    		}
    	}
    le client a l'air de bien marché mais j'ai un pb côté serveur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    [Serveur] En attente de connexion d'un client...
    Connexion acceptée.
    Erreur du serveur.
    java.net.SocketException: Connection reset
    	at java.net.SocketInputStream.read(Unknown Source)
    	at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    	at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    	at sun.nio.cs.StreamDecoder.read(Unknown Source)
    	at java.io.InputStreamReader.read(Unknown Source)
    	at java.io.BufferedReader.fill(Unknown Source)
    	at java.io.BufferedReader.readLine(Unknown Source)
    	at java.io.BufferedReader.readLine(Unknown Source)
    	at Serveur.main(Serveur.java:41)
    merci encore pour ton aide
    claire

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    en fait je ne vois pas trop où je dois créer ma socket!!! (dans ton code)

  5. #5
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    at Serveur.main(Serveur.java:41)
    Et ... c'est laquelle la ligne 41 de ton code Serveur.java ?

    Logiquement, si la ligne concernée est le
    Ca pourrait vouloir dire que la connexion a été fermée prématurément (probablement côté client).

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    J'ai modifié et j'ai rajouté un constructeur pour créer ma Socket/
    Est-ce juste?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public Main(){
    		try {
    			s=new Socket("localhost", portServeur);
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    je n'ai plus d'erreur qui apparait mais rien n'est sauvegardé. Or ma chaine de caractère passé du client au serveur devrait se sauvegarder dans mon fichier texte sauvegarde.txt.
    De plus, je ne me rapelle plus comment je fais dans eclipse pour visualiser d'un côté ma console serveur, et de l'autre ma console client?
    J'ai essayé par la fenêtre de commande mais ça marche pas!!!

Discussions similaires

  1. Application client/serveur sockets
    Par loreleï85 dans le forum Réseau
    Réponses: 4
    Dernier message: 05/01/2007, 12h44
  2. [NIO] envoie d'image à plusieurs client via socket
    Par robert_trudel dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 01/10/2006, 23h11
  3. cherche exemple client udp socket
    Par - Glop - dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 08/06/2006, 10h52
  4. Question client-serveur socket
    Par Lex99 dans le forum Développement
    Réponses: 3
    Dernier message: 07/02/2006, 09h01
  5. Détecter déconnexion client _ socket
    Par Yuli dans le forum MFC
    Réponses: 5
    Dernier message: 04/03/2005, 13h02

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