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

  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!!!

  7. #7
    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
    Je viens seulement de voir ton implémentation de la fonction writeToSocket.
    Elle n'est pas correcte car à chaque fois que tu appelles cette fonction, tu re-créé le PrintWriter, OutpuStream, etc...

    Comme dans mon exemple du post ci-dessus, la fonction writeToSocket ne doit comporter que les trois lignes d'écriture effective sur la socket serveur.

    A charge pour toi d'initialiser tout ce dont a besoin cette fonction (pw, os) en dehors de cette fonction, et avant son premier appel (au moment de l'initialisation de tes sockets par exemple).

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    merci
    le serveur attend bien le client mais quand je lance mon client, rien ne se passe.
    Comment je fais pour voir la fenêtre de contrôle pour le serveur et pour le client?

  9. #9
    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
    ajoute un maximum de System.out.println("...") pour débugguer et voir dans quel état est chacun des programmes.

    Et sinon, essaye de poster l'ensemble de tes codes client et serveur

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    voilà mon 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
    static Socket s;
    	static OutputStream os;
    	static PrintWriter pw;
     
    	public Main(){
    		try {
    			s=new Socket("localhost", portServeur);
    			os = s.getOutputStream();
    			pw = new PrintWriter(os, true);
     
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    public synchronized static void writeToSocket(String chaine) {
     
     
    		pw.println(chaine);
    		pw.flush();
    		try {
    			os.flush();
     
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
     
    		}
    	/**
             * @param args
             */
    	public static void main(String[] args) {
     
    		Main m=new Main();
    		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
    		{
     
    			InputStream is = s.getInputStream();
    			BufferedReader br = new BufferedReader(new InputStreamReader(is));
     
     
    			Main.writeToSocket(clt1.setSauvegarde());
    		br.close();
    		os.close();
    		is.close();
    	}
    	catch (Exception e)
    	{
    		System.err.println("Erreur du client.");
    		e.printStackTrace(System.err);
    	}
     
     
    }
    }
    A priori, c'est lui qui doit encore avoir un pb car voici le début de mon serveur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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.");
    et je n'ai jamais marqué "Connexion acceptée".

    Qu'est qui beug dans mon code???

  11. #11
    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
    commence par gicler les 'static' pour tes fonctions et tes variables, sinon, à chaque création d'un nouveau client, tu écrases les anciennes valeurs stockées notamment dans pw et os.

    Pour rappel, une variable statique est valable pour toutes les instances d'une même classe, or toi tu veux un pw et un os différents pour chacune des 4 instances de la classe Client (enfin j'imagine, mais j'ai du mal à comprendre ce que doit faire ton programme au final et l'intérêt des 4 clients ? Chaque client envoie des trucs ? chaque client envoie le même truc ? etc...).

    Ensuite, que fait clt1.setSauvegarde() ?

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    clt1.sauvegarde permet de récupérer la chaîne de caractère que je dois envoyer au serveur pour qu'il me la sauvegarde dans mon fichier sauvegarde.txt.

    Voici l'erreur qui s'affiche:

    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
    Connection refused: connect
    	at java.net.PlainSocketImpl.socketConnect(Native Method)
    	at java.net.PlainSocketImpl.doConnect(Unknown Source)
    	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    	at java.net.PlainSocketImpl.connect(Unknown Source)
    	at java.net.SocksSocketImpl.connect(Unknown Source)
    	at java.net.Socket.connect(Unknown Source)
    	at java.net.Socket.connect(Unknown Source)
    	at java.net.Socket.<init>(Unknown Source)
    	at java.net.Socket.<init>(Unknown Source)
    	at DEFRANCLIEUClaire.Exercice1.Client.Main.<init>(Main.java:27)
    	at DEFRANCLIEUClaire.Exercice1.Client.Main.main(Main.java:67)
    Erreur du client.
    java.lang.NullPointerException
    	at DEFRANCLIEUClaire.Exercice1.Client.Main.main(Main.java:77)
    ligne 27:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			s=new Socket("localhost", portServeur);
    en tous les cas merci pour ton aide mais je crois que je vais râter cet exam.
    Je pensais avoir un peu cerner le pb mais à priori, je ne comprend pas grand chose.

    Bon assez de lamentation, je vais modifier pour les méthodes statics et je reviens vers toi.
    claire

  13. #13
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    modifications faites, il n'y a plus d'erreur qui sorte mais aucune sauvegarde n'est faite et mon serveur ne m'affiche même pas "connextion acceptée"

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