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 :

Server Multi-Thread Capricieu


Sujet :

avec Java

  1. #1
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut Server Multi-Thread Capricieu
    Bonjour tout le monde,
    Mon serveur à un souci mais lequel?

    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
    public class Server extends Thread{
    	private LauncherServer launcherServer;
    	private Socket socket;
    	private String string;
    	private Integer login;
     
    	public Server(int port){ launcherServer = new LauncherServer(port); launcherServer.start(); }
    	public Server(){}
     
    	public void setSocket(Socket socket) { this.socket = socket; }
    	public void setLauncherServer(LauncherServer launcherServer) { this.launcherServer = launcherServer; }
     
    	public void run(){
    		try {
    			InputStream inputStream = socket.getInputStream();
    			OutputStream outputStream = socket.getOutputStream();
    			System.out.println("1");
    			ObjectInputStream in = new ObjectInputStream(inputStream);
    			System.out.println("2");
    			ObjectOutputStream out = new ObjectOutputStream(outputStream);
     
    			while(true){
    				System.out.println("Attente");
     
    				string = (String)in.readObject();
    				System.out.println(string + "aze");
    				out.writeObject(string + "aze");
    			}
    		} catch (Exception e) {e.printStackTrace();}
     
    	}
    }
    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
    public class LauncherServer extends Thread{
    	private Integer affluence = 0;
    	private Integer port;
     
    	public LauncherServer(int port){ this.port = port; }
     
    	public void run(){
    		try {
    			ServerSocket serverSocket = new ServerSocket(port);
    			while(true){
    				Socket socket = serverSocket.accept();
    				System.out.println("Nouveau client");
    				affluence++;
    				Server server = new Server();
    				server.setLauncherServer(this);
    				server.setSocket(socket);
    				server.start();
    			}
    		} catch (Exception e) {e.printStackTrace();}
    	}
    }
    Le System.out.println("1") s’exécute mais pas le System.out.println("2").
    Voila le code 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
    public class Client {
    	private Integer port;
    	private Integer login;
     
    	public Client(){
    		try {
    			Socket socket = new Socket("localhost", 1234);
    			InputStream inputStream = socket.getInputStream();
    			ObjectInputStream in = new ObjectInputStream(inputStream);
    			OutputStream outputStream = socket.getOutputStream();
    			ObjectOutputStream out = new ObjectOutputStream(outputStream);
    			while(true){
    				Scanner scanner = new Scanner(System.in);
    				String string = scanner.nextLine();
    				out.writeObject(string);
    			}
    		} catch (Exception e) { e.printStackTrace(); }
    	}
    }
    Voilà, merci de votre aide.
    N'hésitez pas à me dire si d'autres trucs vous piques les yeux.
    Je prendrai toutes remarques et critiques avec le plus grand des plaisirs.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le problème c'est que ObjectInputStream et ObjectOutputStream c'est prévu pour serialiser ou désérialiser des objets (Java), sous une forme bien définie. Le new ObjectInputStream commence dès la construction à lire le flux (un header) donc bloque tant qu'il ne l'a pas, donc le message "2" ne s'affichera pas tant que ce header n'aura pas été lu (donc écrit de l'autre côté, et comme le client fait la même chose, les deux restent interbloqués). En mode intéractif, comme tu l'as fait avec le Scanner, ce n'est pas adapté, ou alors il faudrait chaque message tapé au clavier constitue un unique complet objet échangé (la seconde solution dans la liste ci-dessous) mais c'est overkill pour échanger du texte.
    Pour échanger des messages de type String, utilise des BufferedReader et BufferedWriter (ou PrintWriter, ou PrintStream). Pour des données Java, DataInputStream et DataOutPutStream.

    Ne créer pas d'instance de Scanner dans la boucle du client : il ne faut qu'un seul Scanner sur System.in par programme.

    Tu as deux façons d'envisager la communication :
    1. un processus continue : on se connecte, on boucle tant qu'on a des trucs à s'échanger, on se déconnecte
    2. on répète tant qu'on veut : on se connecte, on échange, on se déconnecte

    Toi, tu as opté pour la première solution : en cas de déconnexion (serveur s'arrête, socket non disponible, réseau qui foire, etc), patatras le client s'arrête.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Merci de ta réponse Joel,
    J'ai utiliser un String parce que bon voilà, mais je compte utiliser des objets personnalisés.
    Par contre j'ai pas bien compris ton histoire de header.
    J'ai regarder vite fait sur le net, j'ai vu un truc qui m'a fait tilt, faut pas tomber dans ce model ou f1 appel f2 et f2 appel f1.
    Du j'ai modifier le code pour ne pas que server appel launcherServer qui lui appel server.
    En gros je fait launcherServer puis server mais le problème persiste.
    Alors peut être qu'il ne faut pas utiliser ObjectOutputStream du coté Server et Client en même temps mais alors je sais pas comment faire
    parce que j'en ai besoin des deux côtés.
    D'après toi qu'est-ce que je n'ai pas compris de ce que tu m'a dit?
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pecose Voir le message
    J'ai utiliser un String parce que bon voilà, mais je compte utiliser des objets personnalisés.
    Pourquoi faire ? Cela va te compliquer la vie (les objets peuvent avoir des références sur d'autres objets qui ne sont que dans le serveur, ou que dans le client, en plus les versions des classes doivent être les mêmes des deux côtés). Je n'en vois pas trop l'intérêt de tout manière : on transporte la plupart du temps des données simples. Pour partager des objets, autant utiliser RMI. Si le but c'est de transporter des datas (juste des valeurs primitives, un DataInputStream/DataOutputStream est suffisant).

    Citation Envoyé par Pecose Voir le message
    Par contre j'ai pas bien compris ton histoire de header.
    La sérialisation ça repose sur un format précis qui commence par un header. Et new ObjectInputStream commence par lire ce header. C'est ce que j'ai écrit et je vois pas trop comment l'écrire autrement. Va regarder la doc sur la sérialisation/désérialisation en Java et sur ces classes (tout est écrit dedans, à quoi ça sert et comment ça fonctionne).

    Citation Envoyé par Pecose Voir le message
    J'ai regarder vite fait sur le net, j'ai vu un truc qui m'a fait tilt, faut pas tomber dans ce model ou f1 appel f2 et f2 appel f1.
    Du j'ai modifier le code pour ne pas que server appel launcherServer qui lui appel server.
    Oui, ça, c'est autre chose. J'ai failli t'en parler mais tu n'appelles pas le constructeur de Server qui génère un LauncherServer (sinon tu aurais de toute manière une erreur puisque le port serait déjà occupé).

    Citation Envoyé par Pecose Voir le message
    En gros je fait launcherServer puis server mais le problème persiste.
    Pas étonnant, parce que ça n'a rien à voir d'autant que le code qui poserait problème n'est pas exécuté. C'est pour ça que je n'en ai pas parlé. Mais c'est toujours bien que tu vires ça, parce que ça ne sert à rien si ce n'est pas utilisé, et ça ne fonctionnera pas si ça l'est.

    Citation Envoyé par Pecose Voir le message
    Alors peut être qu'il ne faut pas utiliser ObjectOutputStream du coté Server et Client en même temps mais alors je sais pas comment faire
    parce que j'en ai besoin des deux côtés.
    On peut l'utiliser des deux côtés, mais en faisant les choses dans l'ordre :

    • côté serveur, on ouvre le ObjectInputStream, on consomme le flux, on ferme, puis on répond en ouvrant l'ObjectOutputStream, en écrivant dedans puis en fermant
    • côté client, on ouvre le ObjectOutputStream, on envoit l'objet, on ferme, puis on lit la réponse du serveur, en ouvrant l'ObjectInputStream, en lisant le contenu puis en fermant.
    • ou l'inverse, mais pas les deux en même temps dans les deux directions. Parce que ce que toi tu fais : c'est tout ouvrir des deux côtés, puis écrire. Du coup, l'ouverture dans les deux ObjectInputStream étant bloquante des deux côtés, aucun code qui pourrait écrire et donc débloquer l'un des deux ne risquent pas de s'exécuter. Le principe de base à capter dès le départ c'est que toute lecture est bloquante.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Merci Joel.
    Tu répond toujours très rapidement et tu prend beaucoup de temps pour répondre.
    C'est très appréciable, tu m'est d'une grande aide.
    Merci encore.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. Réponses: 2
    Dernier message: 15/05/2004, 18h33
  3. Réponses: 16
    Dernier message: 30/01/2004, 11h05
  4. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01
  5. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09

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