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 :

Equivalent de la fonction select en C ou C++


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Points : 16
    Points
    16
    Par défaut Equivalent de la fonction select en C ou C++
    bonjour, a tous voila je suis étudiant en informatique et je rencontre quelque difficulté a trouver un équivalent de la fonction select du langage c ou c++, globalement je doit réaliser un client qui contient une IA et je ne peux faire qu'un seul thread du coup je me retrouve bloquer a cause du read de la socket
    si quelqu'un avais l'amabilité de m'aider a corriger se problement

    cordialement

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    globalement je fait un readline qui bloque et j'aimerais qu'il read seulement quand in y a des info a lire pour pas qu'il ne bloque le rest de l'appli

  3. #3
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Hello,

    tu as une méthode available() qui te renvoie combien d'octets tu peux lire sans bloquer :
    socket.getInputStream().available()

    Simple curiosité, pourquoi tu te limites à 1 seul thread ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu ne pourra pas utilise readline en non bloquant, par définition cette méthode attends une retour à la ligne.

    Pour lire la socket en non bloquant, il y a les méthodes available de inputstream.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    pour les thread j'ai malheureusement des condition a respecter dans le sujet et je n'est droit qu'a un seul thread par programme sinon sa aurait été vite fait bien fait, je vais tester vos méthode et je vous tien au courant en tous ca merci de répondre un dimanche

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    y aurait 'il une autre methode du style readline pour read une socket sans la bloquer ?

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    getInputStream().read(buffer,offset,taille) en s'assurant que taille <= getInputStream().available().


    Citation Envoyé par philip_b Voir le message
    je n'est droit qu'a un seul thread par programme
    Pour info, c'est impossible à faire, java lance d'office plusieurs thread dès le démarragedu programme (Garbage collector et Event dispatch thread, entre autres)

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    getInputStream().read(buffer,offset,taille) en s'assurant que taille <= getInputStream().available().



    Pour info, c'est impossible à faire, java lance d'office plusieurs thread dès le démarragedu programme (Garbage collector et Event dispatch thread, entre autres)
    sa je le conçoit bien mais nous il nous autorise seulement un seul thread dans notre appli apres celle qui son faite de façon normal sans l'intervention du programmeur son autorisé

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui mais si tu travaille en application graphique, des threads tu en mangera, et tu sera vraisemblablement obligé d'en créer

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    j'ai un petit souci avec le buffer du read je ne peux pas lui passer de type String il ne prend ke des bite[] et cela m'embête car j'ai besoin de String
    j'ai encore du mal avec le java

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    j'ai trouvé quelque chose qui a l'aire de marcher
    if (buff.ready() == true)
    lCmd = buff.readline();

    qu'en pensé vous?

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ready() te garantis que le prochain appel à read() sur le reader ne bloquera pas, pas que le prochain readLine ne bloquera pas. Ainsi, si t'a reçu une demi ligne, ready() te renverra true, mais readLine attendra la fin de la ligne sur le réseau.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    ok merci de vos réponse, après une relecture du sujet normalement toutes les commande envoyer depuis le serveur on un retour a la ligne donc tous devrais être nickel. en tous cas merci de vos réponse bonne journée a tous

  14. #14
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Points : 380
    Points
    380
    Par défaut
    Il y a une correspondance avec la fonction select() en java nommé le Selector (java.nio.channels).

    Le principe est simple, tu enregistre tes channels (SocketChannel pour les Sockets) dans le selector via la méthode SelectableChannel#register(Selector, int).
    Il te donne une clé auquel tu peux lier un objet, ce qui est pratique pour y mettre une représentation de ton client par exemple et ne plus faire le mapping socket/client toi même.
    Tu fait ensuite un switch/case sur les constantes statiques de SelectionKey.
    Accept = serversocket pret à faire la méthode accept() (comme un read en C mais il n'y a plus les tests à faire pour savoir si c'est le serveur qui est prêt)
    Connect = socket client connecté. (C'est utile uniquement pour les histoires de sessions)
    Read = socket client avec des données en attente. (comme en C mais cela ne concerne plus les serversocket !)
    Write = socket client prêt à envoyer des données. (comme en C)


    Le code à écrire est très souvent le même quelque soit l'application. Trouver des exemples ne sera pas si difficile à mon avis. Pour ma part, j'ai vu comment ça fonctionne par le jeu, en décortiquant les serveurs : http://l2jserver.com/svn/trunk/MMOCore/ (attention, code bourrin et sans commentaires :p)

  15. #15
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 163
    Points
    163
    Par défaut
    Bonjour philip_b,

    La solution de Grimly est ce qui s'approche le plus de ce que tu voulais faire.

    Par contre, je rebondis sur une de tes remarques:
    après une relecture du sujet normalement toutes les commandes envoyées depuis le serveur ont un retour à la ligne
    Même si ce n'est qu'un exercice, ça n'est pas forcément une bonne habitude que se cantonner à ce qui peut se passer normalement. Ainsi, comment réagirait l'application cliente si, pour une raison ou une autre, ce fameux "retour à la ligne" n'arrivait jamais?

    Pour prendre une analogie, normalement une page web se termine par </html>. Maintenant, tu ne serais sans doute pas satisfait d'un navigateur qui attendrait indéfiniment l'arrivée de cette balise si le serveur web (ou le réseau, ou le proxy, ou...) avait la mauvaise idée de "planter" avant de la transmettre...

    A+
    - Sylvain

Discussions similaires

  1. Réponses: 10
    Dernier message: 23/10/2008, 13h58
  2. la fonction select()
    Par youp_db dans le forum Windows
    Réponses: 1
    Dernier message: 02/09/2005, 16h03
  3. Réponses: 9
    Dernier message: 24/05/2005, 16h34
  4. Equivalent de la fonction d'agregat LIST ?
    Par rahan15 dans le forum SQL
    Réponses: 5
    Dernier message: 10/12/2004, 22h21
  5. Equivalent de la fonction trim
    Par PCHINK dans le forum C
    Réponses: 6
    Dernier message: 21/03/2004, 18h02

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