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

Langage Java Discussion :

envoyer et recevoir les données avec les sockets


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Par défaut envoyer et recevoir les données avec les sockets
    Bonjour a tous

    Je suis en train de faire un QCM entre un serveur ui dispose d'uns base de donné mySQL et un client, j'ai crée un réseau pour qu'ils puissent communiquer entre eux avec les sockets.

    j'arrive à envoyer des "println" au client mais quand je demande de saisir un nombre je n'y arrive pas.
    je vous met le code du serveur et du client pour avoir votre avis
    le code serveur est un peu grand a cause de la connection à la BD et de différentes config, je bloque a la ligne 73 je ne sais pas trop quoi mettre.
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.Statement;
    import java.util.Scanner;
     
     
     
     
    public class Main {
     
    	public static void main(String[] args){
    		Scanner sc = new Scanner(System.in);
    		int a= 0;
    		ServerSocket socketserver;
    		Socket socketduserveur ;
    		BufferedReader in = null ;
    		PrintWriter out;
    		BufferedReader inc = null;
     
    	 try {
     
    	      Class.forName("com.mysql.jdbc.Driver");
    	      System.out.println("Driver O.K.");
     
    	      String url = "jdbc:mysql://localhost:3306/mydb";
    	      String user = "root";
    	      String passwd = "louis";
     
    	     Connection conn = DriverManager.getConnection(url, user, passwd);
    	     System.out.println("Connecté à la base de données"); 
    	     Statement state = conn.createStatement();
    	     ResultSet result = state.executeQuery("SELECT * FROM quizz");
    	     ResultSetMetaData resultMeta = (ResultSetMetaData) result.getMetaData();
    	     result.last();
    	     int nombreLignes = result.getRow();
    	     result.beforeFirst();	  
     
    	      socketserver = new ServerSocket(2009);
    	      System.out.println("Le serveur est à l'écoute du port "+socketserver.getLocalPort());
    	      socketduserveur = socketserver.accept(); 
    		  System.out.println("client connecté");
    		  in = new BufferedReader(new InputStreamReader(socketduserveur.getInputStream()));
    		  out = new PrintWriter(socketduserveur.getOutputStream());
    		  out.println("Vous êtes connecté");
    		  out.flush();
     
     
     
    	      out.println("Il y a "+nombreLignes+ " questions");	      
    	      Thread.sleep(1000);	
    	      out.println("\nQuestions:\n\n");
    	      out.flush();
    	      while(result.next()){         
    	    	    Thread.sleep(1000);	
    		        out.print("\n\n"+result.getInt("id")+")");
    		        out.flush();
    		        out.print(" " + result.getString("question") + "\n");
    		        out.flush();
    		        for(int i = 3; i <= 6; i++)  
    		        	out.print("\t" + (i-2) +"- " + result.getString(i) + "\n");
    		        out.flush();
    		        out.print("\nVeuillez saisir votre réponse:");
     
    		        //int rep = sc.nextInt();
    		        int rep = inc.read();
     
    		        if(rep == result.getInt("corrige")){
    		        	out.println("Bonne réponse");
    		        	out.flush();
    		        	//result.updateInt("resultat",1);
    		        	a++;
    		        }
    		        else{
    		        	out.println("Mauvaise réponse, la bonne réponse était "+ result.getString((result.getInt("corrige")+2)));
    		        	out.flush();
    		        	//result.updateInt("resultat",0);
    		        }
    		        Thread.sleep(1000);
    		        out.println("Votre score est de "+ a +"/"+result.getInt("id")+".");
     
    	      }
    	      out.flush();       
    		  socketduserveur.close();
    	      socketserver.close();
     
    }
    	 catch (Exception e) {
    	      e.printStackTrace();
    	      System.out.println("\nerreur 1");
    	    }
    }
    }
    il me met java.lang.NullPointerException at Main.main(Main.java:73) pour le serveur

    le 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
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.util.Scanner;
     
     
    public class Client {
     
    	public static void main(String[] zero) {
     
     
    		Socket socket;
    		BufferedReader in;
     
    		Scanner sc = new Scanner(System.in);
    		int b=0;
    		int rep;
    		PrintWriter out =null; 
    			try {
     
    				socket = new Socket("192.168.137.1",2009);	
    			        System.out.println("Demande de connexion");
     
    			        in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
    			        out = new PrintWriter(socket.getOutputStream());
    			        sc = new Scanner(System.in);
     
    			        	System.out.println(in.readLine());
    			        	System.out.println(in.readLine());
    			            System.out.println(in.readLine());
    			            System.out.println(in.readLine());
     
    			            for(int i=0;i<5;i++){
    			        while(b<9){
    			        	System.out.println(in.readLine());
    			        	b++;
    			        }
    			        rep = sc.nextInt();
    			        i++;
    			            }
    			        out.flush();
     
    			        socket.close();
     
    			}catch (UnknownHostException e) {
     
    				e.printStackTrace();
    			}catch (IOException e) {
     
    				e.printStackTrace();
    			}
     
    		}
     
     
    	}
    la boucle for, le while et les lignes System.out.println(in.readLine()); servent à ce que le client affiche a chaque ce que le serveur envoie, je ne sais pas si c'est comme qu'il faut faire ( ça fait un peu bourrin).

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par thejavator Voir le message
    il me met java.lang.NullPointerException at Main.main(Main.java:73) pour le serveur
    Bah oui, c'est quoi ce inc ? Il est toujours null, qu'est-ce qu'il fait là ?

    Citation Envoyé par thejavator Voir le message
    la boucle for, le while et les lignes System.out.println(in.readLine()); servent à ce que le client affiche a chaque ce que le serveur envoie, je ne sais pas si c'est comme qu'il faut faire ( ça fait un peu bourrin).
    C'est pas que ce soit vraiment mauvais, mais il faudra peut-être songer à envoyer une réponse au serveur, non ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Par défaut
    le inc correspond a la lecture du buffer (BufferedReader inc = null il est censé récupérer ce que le client à saisit
    j'envoie une réponse à la ligne 44 avec " rep = sc.nextInt();" .
    mais je pense que c'et pas comme ça qu'il faut faire mais je ne vois pas comment

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par thejavator Voir le message
    le inc correspond a la lecture du buffer (BufferedReader inc = null il est censé récupérer ce que le client à saisit
    - Tu penses qu'il va faire ça en faisant inc = null ? Je ne crois pas...
    - C'est pas censé être le travail de in, ça ?

    Citation Envoyé par thejavator Voir le message
    j'envoie une réponse à la ligne 44 avec " rep = sc.nextInt();" .
    mais je pense que c'et pas comme ça qu'il faut faire mais je ne vois pas comment
    Je suis à peu près sûr que cette ligne lit ce que la personne a tapé sur son clavier, et n'a absolument rien à voir avec envoyer des trucs entre serveur et client.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Par défaut
    j'ai fait un simple programme pour regarder a l'endroit ou je n'arrive pas, le serveur demande de saisir quelque chose au client et envoie la saisie au serveur

    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
    package test;
     
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
     
    public class test {
    	public static void main(String[] args){
    		ServerSocket socketserver;
    		Socket socketduserveur ;
    		BufferedReader in = null ;
    		PrintWriter out;
    	try{
    	 socketserver = new ServerSocket(2009);
        System.out.println("Le serveur est à l'écoute du port "+socketserver.getLocalPort());
        socketduserveur = socketserver.accept(); 
    	System.out.println("client connecté");
    	in = new BufferedReader(new InputStreamReader(socketduserveur.getInputStream()));
    	out = new PrintWriter(socketduserveur.getOutputStream());
    	out.println("Vous êtes connecté");
    	out.flush();
    	out.println("Saisissez quelque chose: ");
    	out.flush();
    	int rep = in.read();
        System.out.println(rep);
     
    	out.flush();       
    	socketduserveur.close();
        socketserver.close();
    	}
    	 catch (Exception e) {
    	      e.printStackTrace();
    	      System.out.println("\nerreur 1");
    	    }
     
     
     
    }
    }
    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
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.util.Scanner;
     
     
    public class clienttest {
     
    	public static void main(String[] zero) {
     
     
    		Socket socket;
    		BufferedReader in;
     
    		Scanner sc = new Scanner(System.in);
    		int b=0;
    		int rep;
    		PrintWriter out =null; 
    			try {
     
    				socket = new Socket("192.168.137.1",2009);	
    			        System.out.println("Demande de connexion");
     
    			        in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
    			        out = new PrintWriter(socket.getOutputStream());
    			        sc = new Scanner(System.in);
     
    			        	System.out.println(in.readLine());
    			        	System.out.println(in.readLine());
    			        	rep = sc.nextInt();
    			        	out.println(rep);
    			            System.out.println(in.readLine());
     
     
    			        out.flush();
     
    			        socket.close();
     
    			}catch (UnknownHostException e) {
     
    				e.printStackTrace();
    			}catch (IOException e) {
     
    				e.printStackTrace();
    			}
     
    		}
     
     
    	}
    je lance le programme et au moment de saisir il ne réagit pas, je ne vois pas ce qu'il ne va pas
    existe t'il une fonction qui permet d'envoyer des données ?

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Il y a deux problèmes côté client :

    - Tu fais deux fois sc = new Scanner(System.in);. Il ne faut surtout pas faire ça, les deux Scanner vont se disputer l'entrée standard et on ne sait jamais lequel lira quoi.

    - Quand tu envoies au serveur avec out.println(), il faut faire le flush() tout de suite après, avant de faire un in.readLine(). Si tu ne flushes pas, il y a de bonnes chances que rien ne soit envoyé, donc que le serveur ne reçoive rien, et donc qu'il n'envoie rien en retour, et donc que in.readLine() attende pour toujours.
    En fait, plutôt que de faire un flush à chaque fois, il est plus simple de configurer le PrintWriter en autoflush : out = new PrintWriter(socket.getOutputStream(), true); .
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/01/2015, 13h49
  2. Réponses: 7
    Dernier message: 20/11/2012, 14h24
  3. Réponses: 2
    Dernier message: 20/01/2012, 10h03
  4. Envoyer et recuperer des buffers avec les Socket
    Par kaderscream dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/08/2006, 11h44

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