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

JDBC Java Discussion :

Application Client Serveur avec DB Oracle


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut Application Client Serveur avec DB Oracle
    Bonjour,

    Je souhaiterais réaliser une application client-serveur en Java qui enverrait un query vers une base de données Oracle et qui me permettrais d'afficher le résultat de cette question via l'application cliente. Je sais que je dois utiliser des Threads et des Sockets mais je pautauge un peu beaucoup là-dedans, vous auriez un chouette exemple pour moi s'il vous plaît ?!

    J'ai déjà questionné mon amis Google et ce forum mais je n'ai rien trouvé qui m'aide vraiment. (Faut croire que je ne suis vraiment pas assez doué pour adapter les codes que je peux trouver sur internet :-( ).

    D'avance merci.
    Bien à vous.
    Ouranos21

  2. #2
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Ce n'est pas nécessaire d'utiliser des threads et des sockets pour cela.
    Il te faut juste creer une connexion a ta base de données Oracle via JDBC.

    Regarde dans cette section des tutoriels :
    http://java.developpez.com/cours/#jdbc

    Je pense que cela devrait répondre à tes questions.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Je vais donc développer un peu plus mon truc.

    Cette application est une application de monitoring qui doit tourner simultanément (et donc en parallèle) sur deux serveurs. Et si un à un problème, l'autre doit être au courant. De plus cette application doit tourner en background. Et indéfiniment. On pourrait par exemple, quand on à besoin de voir ce que renvoi la requête, taper en ligne de commande côté client:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java Monitoring /status
    Où l'application cliente demanderais à l'application serveur de lancer une seule requête et de rediriger la résultat de la requête vers le flux de sortie histoire qu'on puisse récupèrer ça côté application cliente.

    Pour voir ce que ça donne... en gros.

    Je ne sais pas si je suis assez clair dans mon explication, mais d'après mes recherches j'ai besoin de sockets et de threads.

    Et c'est là que je me perds. Je pourrais vous donner mon code, mais je sais pas si c'est une bonne idée, même moi je m'y perd. M'enfin, si y'avait une source facile (et qui enverrais une requête vers un serveur pour afficher la réponse côté client) pour que je pige les concepts, parce que là :S

    Merci tout de même pour la réponse Willoi ^^

    PS: L'OS côté serveur est un Linux...

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    J'avance petit à petit dans mon truc, mais je crois de mon souci viens de mon application cliente.

    A quoi devrait ressembler une application cliente qui, par exemple lorsqu'on la démarre et qu'on écrit "status" (en ligne d ecommandes) nous renvoie le résultat à l'écran d'une requête SQL qui s'effectue côté serveur ? (bête requête du genre "SELECT noms FROM ma_table;"

    Ou alors à la limite juste une application cliente qui, lorsqu'on la démarre, affiche tout bêtement le résultat d'une requête SQL qui tourne côté Serveur. En gros je sais que côté serveur mon appli tourne bien. Là avec mes socket, mon application serveur démarre et attend une qu'un client s'y connecte, lorsque le client est connecté, la requête sur la DB se lance, ça fonctionne côté serveur j'en suis sure, mais j'arrive pas à afficher le résultat de cette requête côté client... .

    Comme ça je pourrais comparer avec ce que je fais et voir si mon problème vient de ce que je fais du côté application serveur, ou du côté client. Mais je pense quand même que ça vient du côté client.

    Merci.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Allez je partage quand même mon code supposé foireux. La méthode select() exécute ma requête SQL et est censée afficher le résultat de la requête.

    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
     
    public void select(String request)
    	{
    		int cpt=0;
    		String db_name=" ";
    		//request 
    		try 
    		{
    			Statement stm = con.createStatement();
    			rs = stm.executeQuery(request);
    			BufferedReader entreeClavier = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
          		DataOutputStream sortieVersClient = new DataOutputStream(connexion.getOutputStream());
          		//PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);
    			while (rs.next()) //fetching the resultset
    			{
    			    	db_name=rs.getString(1);
    			    	sortieVersClient.writeBytes(db_name+ " ");
    			    	//sortie.println(db_name + " ");
    			    	System.out.println(db_name+ " ");
    			    	//System.out.println("Ici ça passe, YEAH !");
    			    	cpt++;
    			}
    			//sortie.println(cpt + " Row(s) Found");
    			sortieVersClient.writeBytes(cpt + " Row(s) Found"); 	//Displays the number of rows returned.
    			rs.close();   							//close the resultset
    		} 
    		catch (SQLException e) 
    		{
    			tool.display("Abnormal request execution");
    		}
    		catch(IOException exep)
    		{
    			System.out.println("Stream Problem");
    		}		   
    	}
    Ca, ça tourne côté serveur.

    J'ai fais quelques test avec PrintWriter et DataOutputStream, voilà pourquoi les commentaires...

    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
     
    BufferedReader entreeClavier = new BufferedReader(new InputStreamReader(System.in));
    			Socket connexion = new Socket("127.0.0.1", 9000);
    			DataOutputStream sortie = new DataOutputStream(connexion.getOutputStream());
    			//PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);
    			BufferedReader entreeDepuisServeur = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
    			String envoi=" ";
    			boolean continu = true;
    			while (true) 
    			{
     
    				while(continu=true)
    				{
    					envoi = entreeClavier.readLine();
    					if(envoi.compareTo("status")==0)
    					{
    						continu=false;
    					}
    					else
    					{
    						System.out.println("Invalid Command");
    						System.out.println("Command available for the moment: status");
    					}
    				}
     
    				//sortie.println(envoi);
    				sortie.writeBytes(envoi);
    				System.out.println(envoi);
     
    				String reponseDuServeur = entreeDepuisServeur.readLine();
     
    				System.out.println("Recu du serveur: " + reponseDuServeur);
     
    				connexion.close();
    }
    		}
    		catch(IOException e) 
    		{ 
    			System.out.println("Erreur : "+e); 
    		}
    		System.out.println("Connexion closed...");
    Et ça c'est côté client...

    Bon, où ai-je fais une bête erreur ?

    EDIT:

    J'ai oublié de vous coller quelques lignes de 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
     
    public class ServeurThread 
    {
      public static void main(String[] args) 
      {
     
        try 
        {
          ServerSocket service = new ServerSocket(9000); //On crée le Socket
          while (true) //boucle infinie
          {
            Socket connexion = service.accept();      //on lui demande d'attendre une requête client
            new ThreadConnexion(connexion).start(); //on instancie l'objet qui fait les traîtements
          }
        }
        catch (IOException e) 
        { 
        	System.err.println(e); 
        }
      }
     
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public ThreadConnexion(Socket connexion) 
      {
        this.connexion = connexion;   
      }
    /EDIT
    Merci aux gens plus doués que moi ! ^^

  6. #6
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Mas au juste quel est ton probleme ?
    si tu as des erreurs : donne la trace complete de tes exceptions.

  7. #7
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Le truc c'est que je n'ai pas du tout d'erreur. Je n'arrive juste pas à afficher côté client, ce que le serveur devrait renvoyer.

    Du coup je sais pas bien si c'est le serveur qui déconne ou mon client... côté serveur, je sais que l'application tourne bien. Si j'affiche les résultats dans la console du Serveur, ça s'affiche bien (par un System.out.println), nickel même. Mais pas moyen d'afficher ce résultat de requête côté Client.

    Mais je n'ai aucune erreur, et j'ai suivis plusieurs tutos là-dessus, je pense bien appliquer le même schèma de communication en utilisant les bonnes classes et tout et tout, mais sur mon appli la logique de ces tutos ne fonctionne (tuto sur un serveur d'echo qui va nickel) pas.

    Là mon appli est censée attendre une frape clavier côté client avant de déclencher la requête, une fois la "chaîne" client envoyée au serveur, la requête se lancer, et envoie son résultat à l'appli client qui est censée l'afficher. J'ai un peu débuggé le truc, et je sais que la "string" envoyée au serveur déclenche bien la requête qui s'effectue comme elle doit. Mais pas moyen de renvoyer la réponse/le résultat de cette requête (qui comprend quelques 100aines de rows) au client et de l'afficher...

    Ca fait deux jours que je check la logique de mon code et je vois pas où ça cloche :-(.

    Cordialement.

  8. #8
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Fais voir le code complet coté client.

  9. #9
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Yep.

    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
     
    package DatabaseListing; 
    import java.io.*;
    import java.net.*;
     
    public class Client2 
    {
    	public static void main(String[] args) 
    	{
    		try 
    		{
    			BufferedReader entreeClavier = new BufferedReader(new InputStreamReader(System.in));
    			Socket connexion = new Socket("127.0.0.1", 9000);
    			//DataOutputStream sortie = new DataOutputStream(connexion.getOutputStream());
    			PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);
    			BufferedReader entreeDepuisServeur = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
    			String envoi=" ";
    			boolean continu = true;
    			while (true) 
    			{
     
    				while(continu=true)
    				{
    					envoi = entreeClavier.readLine();
    					if(envoi.compareTo("status")==0)
    					{
    						continu=false;
    					}
    					else
    					{
    						System.out.println("Invalid Command");
    						System.out.println("Command available for the moment: status");
    					}
    				}
     
    				sortie.println(envoi);
    				//sortie.writeBytes(envoi);
    				System.out.println(envoi);
     
    				String reponseDuServeur = entreeDepuisServeur.readLine();
     
    				System.out.println("Recu du serveur: " + reponseDuServeur);
     
    				connexion.close();
    			}
    		}
    		catch(IOException e) 
    		{ 
    			System.out.println("Erreur : "+e); 
    		}
    		System.out.println("Connexion closed...");
    	}
    }
    Voilà.

    Et merci pour l'aide ^^

  10. #10
    Invité
    Invité(e)
    Par défaut
    Heuu je tombe un peu dans le truc mais
    Tu veux que ton client demande à ton serveur d'exécuter une requête sur la base de données ? Pourquoi tu veux passer par un serveur ? Tu pourrais durecytement interroger la base de données depuis ton client..

  11. #11
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Heu... ouais...

    Mais en fait l'application serveur doit tourner comme étant un serveur, elle tourne indéfiniment, et l'application client n'est en principe là que pour checker, au besoin le "status" de ce que le serveur renvoi. Cette opération doit être faite sur deux serveurs simultanément.

    En gros l'appli serveur tourne sur deux serveurs linux, en tant que service. Et, à terme, quand il y aura un souci sur une des deux machines ou plutôt sur une des deux bases de données, l'autre machine devra le savoir, et en fonctione du problème faire des choses.

    Autre truc, j'ai créé un fichier de configuration dont l'appli serveur se sert pour la connexion et la requête. Le concept est que n'importe qui puisse configurer l'application sans toucher au code.

  12. #12
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    et que s'affiche t-il dans la console ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Tu sauraios donner le bout de code ou ton serveur récupère la String à envoyer, l'affiche à la console et est censé l'envoyer au client ?
    Tu n'oublie pas de faire un flush() sur ton outputstream ?

  14. #14
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Côté client, rien.

    Par contre côté serveur, au moment où il est censé envoyer le flux, je fais un system.out.println sur la variable pour bien checker que ce qu'il à envoyé est ce qu'il devait envoyer (une liste de quelques 320 strings). Côté console serveur, il effectue la requête correctement. Côté client, rien ne s'affiche.

  15. #15
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Le serveur est censé renvoyer le résultat de la requête avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (rs.next()) //fetching the resultset
    			{
    			    	db_name=rs.getString(1);
    			    	//sortieVersClient.writeBytes(db_name+ " ");
    			    	sortie.println(db_name + " ");
    			    	System.out.println(db_name+ " ");
    			    	cpt++;
    			}
    Et ce qui s'affiche côté serveur par le System.out.println est censé s'afficher aussi côté client.

    Pour le outputStream, le flush() est censé se faire avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);
    Avec le booléen passé à "true" que je défini côté serveur. Non ?!

    Enfin c'est ce que j'avais lu sur le net.

    PS: Blaise, j'arrive pas à trouver de bout de code qui concerne une quelconque application de monitoring qui pourrait exister sur SourceForge... :/

  16. #16
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Alors j'ai un peu raccourci mon code côté client, qui dorénavant ressemble à ceci:
    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
     
    package DatabaseListing; 
    import java.io.*;
    import java.net.*;
     
    public class Client2 
    {
    	public static void main(String[] args) 
    	{
    		try 
    		{
    			BufferedReader entreeClavier = new BufferedReader(new InputStreamReader(System.in));
    			Socket connexion = new Socket("127.0.0.1", 9000);
    			//DataOutputStream sortie = new DataOutputStream(connexion.getOutputStream());
    			PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);
    			BufferedReader entreeDepuisServeur = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
    			String envoi=" ";
    			boolean continu = true;
    			while (true) 
    			{
    				envoi = entreeClavier.readLine();
     
    				sortie.println(envoi);
    				//sortie.writeBytes(envoi);
    				System.out.println(envoi);
    				System.out.println("blop");
    				String reponseDuServeur = entreeDepuisServeur.readLine();
     
    				System.out.println("Recu du serveur: " + reponseDuServeur);
     
    				connexion.close();
    			}
    		}
    		catch(IOException e) 
    		{ 
    			System.out.println("Erreur : "+e); 
    		}
    		System.out.println("Connexion closed...");
    	}
    }
    Et maintenant j'ai une erreur:

    Erreur : java.net.SocketException: Software caused connection abort: recv failed
    Si je pige tout bien, soit le client ne reçois pas grand chose. Donc le soucis viendrait du côté serveur ? :S

    Ce qui est sûr c'est que j'ai un problème de flux. J'vais ptetre me mettre au feng shui, mes chakras doivent pas être tous ouverts...

    Alors j'ai effectué une recherche Google sur base de cette erreur et... je ne trouve rien de bien concluant

  17. #17
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Bon, bêtement il fallait que j'envoie un "\n" vers le serveur pour bien lui spécifier que le client avait fini d'émettre :S... Sinon ça, ça marche, mais je suis pas au bout de mes peines. J'ai d'autres soucis qui se pointes. Mais je vais vous poser mes questions dans un autres sujet.

    Merci de votre aide à tous.

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

Discussions similaires

  1. Application client serveur avec GWT
    Par flykev dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 03/05/2008, 16h43
  2. application client-serveur avec les sockets
    Par matheo600 dans le forum C++
    Réponses: 1
    Dernier message: 20/04/2008, 18h21
  3. application client/serveur avec les sockets
    Par baya1 dans le forum JBuilder
    Réponses: 1
    Dernier message: 24/02/2007, 16h37
  4. Réponses: 1
    Dernier message: 01/02/2006, 18h48

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