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

avec Java Discussion :

Client / Serveur Multithread


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2009
    Messages : 53
    Par défaut Client / Serveur Multithread
    Bonjour à tous !
    Débutant en Java je viens vers vous pour une petite question que je n'arrive pas a résoudre :
    Je fais actuellement communiquer deux programmes java ultra basique pour tester la communication client/serveur en multithread. Seulement voilà, je souhaites qu'à chaque réception d'une "requête", mon serveur crée un nouveau Thread mais impossible de le faire.

    Mon code coté serveur (deux classes) :

    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
     
    import java.io.*;
    import java.net.*;
     
    class ServeurUDP
    {
          public static void main(String args[]) throws Exception{
     
                //while(true){
                      ServeurUDP serveurUDP = new ServeurUDP();
                      serveurUDP.ServeurUDP();
               // }
     
          }
     
     
          public void ServeurUDP() throws Exception{            
     
                      DatagramSocket serverSocket = new DatagramSocket(7777);
     
                      //while(true){
                            ThreadServeurUDP monThreadServeurUDP = new ThreadServeurUDP(serverSocket); 
                            monThreadServeurUDP.start();
                      //}      
             }
       }
    et

    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
     
    import java.io.*;
    import java.net.*;
     
    public class ThreadServeurUDP extends Thread 
    {
     
          DatagramSocket serverSocket;
     
     
       public ThreadServeurUDP(DatagramSocket pserverSocket){
          try{
     
                serverSocket = pserverSocket;
          }
          catch(Exception e){}
     
       }
     
     
          public void run(){
     
     
                try{
     
                      //DatagramSocket serverSocket = new DatagramSocket(7777);
     
                      byte[] receiveData = new byte[1024];
                      byte[] sendData = new byte[1024];
     
                      while(true)
                         {
     
                            receiveData = new byte[1024];
                            sendData = new byte[1024];
     
                            // on créer un datagrampacket 
                            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                            serverSocket.receive(receivePacket);
     
                            String message = new String( receivePacket.getData());
                            int port = receivePacket.getPort();
     
                            System.out.println("Chaine recue de UDP :" +  port + " : " + message.trim());
                            System.out.println(" --- Thread serv name: " +  this.getName() + "    - " );
                            System.out.println(" --- Thread serv state1 : " +  this.getState() + "    - " );
     
     
                            InetAddress IPAddress = receivePacket.getAddress();
                            String reponsemessage = message.trim();
                            sendData = reponsemessage.getBytes();
     
                            DatagramPacket sendPacket =
                                  new DatagramPacket(sendData, sendData.length, IPAddress, port);
                            serverSocket.send(sendPacket);
     
                            System.out.println(" --- Thread serv state2 : " +  this.getState() + "    - " );
     
     
     
                         }
                   }
                catch(Exception e){}
     
       }
    }
    Actuellement tout fonctionne sur un thread, ce qui est normal sachant que j'ai bouclé à l'interieur de ce thread.
    J'ai essayé de bouclé ailleurs (les while en commentaire) mais j'ai eu l'erreur suivante à chaque fois lors de l'execution (la compilation passe sans broncher) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Exception in thread "main" java.net.BindException: Address already in use: Canno
    t bind
            at java.net.DualStackPlainDatagramSocketImpl.socketBind(Native Method)
            at java.net.DualStackPlainDatagramSocketImpl.bind0(Unknown Source)
            at java.net.AbstractPlainDatagramSocketImpl.bind(Unknown Source)
            at java.net.DatagramSocket.bind(Unknown Source)
            at java.net.DatagramSocket.<init>(Unknown Source)
            at java.net.DatagramSocket.<init>(Unknown Source)
            at java.net.DatagramSocket.<init>(Unknown Source)
            at ServeurUDP.ServeurUDP(ServeurUDP.java:18)
            at ServeurUDP.main(ServeurUDP.java:10)
    Si quelqu'un aurait une solution, merci d'avance de la partager

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Par défaut
    L'erreur me parait explicite: tu ne fermes jamais ta connection, donc la deuxième fois que tu alloues une socket, la première est toujours connectée au port, d'où l'erreur.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2009
    Messages : 53
    Par défaut
    Merci pour ta réponse !
    Je ferme la connexion dans la boucle while de la méthode ServeurUDP() mais j'ai toujours l'erreur.

  4. #4
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2009
    Messages : 53
    Par défaut
    J'ai essayé de faire différemment en créant le Thread après le docket.receive(), cependant j'ai maintenant une autre erreur : un Datapacket passé en argument entraîne un "java.lang.NullPointerException".
    Le code en question mis à jour :

    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.*;
    import java.net.*;
     
    class ServeurUDP
    {
          public static void main(String args[]) throws Exception{
                      ServeurUDP serveurUDP = new ServeurUDP();
                      serveurUDP.ServeurUDP();
          }
     
          public void ServeurUDP() throws Exception{   
    				byte[] receiveData = new byte[1024];  
    				DatagramSocket serverSocket = new DatagramSocket(7777);
    				DatagramPacket receivePacket; 
     
    					while(true){
    						System.out.println("Entre dans while");
     
    						receivePacket = new DatagramPacket(receiveData, receiveData.length);
    						serverSocket.receive(receivePacket);          
    						System.out.println("Apres receilv");
     
    						ThreadServeurUDP monThreadServeurUDP = new ThreadServeurUDP(receivePacket);
    						System.out.println("Apré crea thread");						
    						monThreadServeurUDP.start();
    						System.out.println("Apré  thread");
    						}      
             }
       }
    et

    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
     
    import java.io.*;
    import java.net.*;
     
    public class ThreadServeurUDP extends Thread 
    {   
          DatagramSocket serverSocket;
    	  DatagramPacket receivePacket;
    	  byte[] sendData; 
     
       public ThreadServeurUDP(DatagramPacket pReceivePacket ){
          try{
                serverSocket = new DatagramSocket(7777);
    			this.receivePacket = pReceivePacket;//receiveData = new byte[1024];
                sendData = new byte[1024];
          }
          catch(Exception e){}            
       }
     
    	public void run(){            
                try{
    			System.out.println("TRY");
     
                      //DatagramSocket serverSocket = new DatagramSocket(7777);
                      while(true)
                         {                   
                             // on créer un datagrampacket 
     
                            int port = this.receivePacket.getPort();
     
    						System.out.println(" --- PORT -->" +  port);
     
    						String message = new String( this.receivePacket.getData());
     
    						System.out.println(" --- MESSAGE -->" +  message);
     
                            System.out.println("Chaine recue de UDP :" +  port + " : " + message.trim());
                            System.out.println(" --- Thread serv name: " +  this.getName() + "    - " );
    						System.out.println(" --- Thread serv ID: " +  this.getId() + "    - " );
     
                            InetAddress IPAddress = this.receivePacket.getAddress();
                            String reponsemessage = message.trim();
    						sendData = new byte[1024];
    						sendData = reponsemessage.getBytes();
                            DatagramPacket sendPacket =
                                  new DatagramPacket(sendData, sendData.length, IPAddress, port);
                            serverSocket.send(sendPacket);
                         }
                   }
                catch(Exception e){ System.out.println(" --- Exe -->" +  e.toString());}
       }
    }
    Une petite idée ?

    Merci !

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Quelle ligne pose problème ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2009
    Messages : 53
    Par défaut
    ici c'est lors du passage dans
    int port = this.receivePacket.getPort();
    que l'exception est levée

Discussions similaires

  1. application client-serveur multithread
    Par progcyb dans le forum Threads & Processus
    Réponses: 0
    Dernier message: 14/02/2015, 09h29
  2. Déconnexion client/serveur multithread
    Par zpico dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 07/03/2012, 10h00
  3. Client Serveur multithread : problème
    Par cb-bk dans le forum Threads & Processus
    Réponses: 1
    Dernier message: 04/04/2009, 16h05
  4. Serveur multithread liste des clients
    Par foxer98 dans le forum Langage
    Réponses: 3
    Dernier message: 24/05/2007, 16h38
  5. [client serveur multithread]Java
    Par Zay dans le forum Développement
    Réponses: 4
    Dernier message: 12/04/2007, 23h06

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