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 :

Structure serveur client


Sujet :

Entrée/Sortie Java

  1. #1
    Invité
    Invité(e)
    Par défaut Structure serveur client
    Bonjour, j'étudie actuellement les sockets à l'iut, et pour prendre un peu d'avance je veux m'amuser à me faire une petite "API" de gestion de serveur/client.
    Je m'explique, je veux faire des classe qui permettent de mettre en place un serveur/multi client facilement et rapidement pour l'utiliser pour faire des jeux type plateau/carte/dé.

    En gros ce que je veux c'est un client/serveur qui communique sous forme de "requete (une abstraction des donnes via une classe)". Ce que j'ai pu apprendre pour l'instant c'est que le serveur accepte une connexion que j'ajoute dans une pool et je boucle sur la reception.
    Idem pour le client je me connecte et met dans un thread une boucle pour la reception.

    Maintenant, j'aimmerais pouvoir faire une methode qui fait une requete au serveur mais qui attend une reponse pour la retourner. Seulement mon probleme c'est comment attendre une réponse du serveur alors que mon autre thread coté client qui boucle pour la reception risque de l'intercepter avant. j'ai pensé à synchroniser sur mon InputStream mais je risque vite d'être en deadLock. Ou utiliser deux socket un pour la reception, et l'autre pour l'emission de requete avec retour.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Euh... À moins que tu sois en asynchrone, ce qui pour débuter serait un peu costaud quand même,

    pour le client tu n'as pas besoin d'un "autre thread." Un seul thread suffit. Ça ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try(Socket socket = creerMaSocket()) {
    	InputStream in = socket.getInputStream();
    	OutputStream out = socket.getOutputStream();
    	while(jeNeVeuxPasArreter()) {
     
    		envoyerUneRequete(out);
    		ReponseDuServeur reponse = lireUneReponse(in);
    		faireQuelqueChoseAvecLaReponse(reponse);
    	}
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ouai je comprend, du coup j'ai fait un systeme où l'utilisateur creer un "requestPattern" où il doit surcharger une methode process qu'il ajoute à une classe "RequestProcessing" et cette classe ce charge de rediriger les donnee recu avec le bon process. enfin si vous avez le temps voici mon code : (Dites moi si j'ai fait une aberation )https://github.com/douney/MyServer

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    aberration pas forcément, ça dépend pourquoi tu as fait comme ça.
    Mais :
    - c'est énormément plus compliqué que ce que j'ai dit,
    - ça n'a pas l'air plus puissant que ce que j'ai dit

    Donc a priori comme ça, c'est pas convainquant.
    Pourquoi avoir séparé émission et réception dans deux endroits différents et deux threads ? Le serveur peut décider de sa propre initiative d'envoyer des informations sans avoir reçu de requête ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui, le serveur peut dans le cadre d'un tchat envoyer des donnees sans avoir recu de requette préalable, et comme je fait ce petit projet pour la suite coder différent jeu de carte / plateau et je pense (mais rien n'est encore décidé) que le serveur va gérer le jeu en envoyant une requette de permission de jouer à tour de role, pour ca que je sépare emission et reception et pour la complication je trouve que c'est assez simple a utiliser après je défini le role de mes requetes et j'ai plus qu'à communiquer.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Dans ce cas c'est bien, il aurait juste fallu le dire dès le début.

    Attention côté serveur : il faudrait pas qu'il mélange l'envoi d'une réponse et l'envoi d'un message de sa propre initiative. 'Faut synchroniser l'accès à la socket pour toute la durée d'un envoi, je sais pas si tu le fais.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ha en effet, une question par rapport à ça, si j'utilise un flux bufferisé, sans synchroniser je ne devrais pas avoir de problèmes (en TCP) ?

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ça dépend ce que tu appelles bufferisé.
    Il est vrai que l'InputStream de la socket synchronise les appels à write(), ce qui fait que si tu fais un seul appel pour un envoi de message, les envois de messages ne peuvent pas se mélanger.

    Mais si tu utilises simplement un BufferedOutputStream ça ne change rien : d'abord il faut en utiliser un seul par Socket, donc dans les deux cas tu utilises le même donc ça ne change rien, et ensuite lorsque le buffeur est plein il va l'écrire dans la socket, et donc ça fait autre chose que un appel par envoi de message.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Invité
    Invité(e)
    Par défaut
    Dacodac, merci pour les précisions

Discussions similaires

  1. Structuration échange client serveur
    Par theyankee76 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/05/2007, 21h42
  2. Différence poste serveur/client au niveau hardware et OS
    Par drinkmilk dans le forum Ordinateurs
    Réponses: 5
    Dernier message: 07/04/2005, 16h43
  3. Connection Serveur Client
    Par d.w.d dans le forum C++
    Réponses: 16
    Dernier message: 21/02/2005, 11h17
  4. Serveur/Client sous linux
    Par black is beautiful dans le forum Réseau
    Réponses: 2
    Dernier message: 13/08/2004, 13h34

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