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

Prolog Discussion :

[SWI-Prolog] Les flux "standards" ?


Sujet :

Prolog

  1. #1
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut [SWI-Prolog] Les flux "standards" ?
    Salut,

    Je m'amuse un peu avec la lib socket de SWI.

    Je fais donc un serveur que je fais communiquer avec un client telnet.
    Je veux écrire quelque chose dans la console de mon serveur mais comme le flux courant est celui d'échange avec le socket, c'est impossible à moins d'utiliser write en spécifiant le flux sur lequel je veux écrire.

    Le problème c'est que je ne trouve pas les noms des flux standards d'entrée et sortie à utiliser avec write/2 et read/2.

    Auriez-vous des indices/pages/exemples qui pourraient m'aider ?


  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut

    Je ne sais pas où tu en es, moi, j'ai fait ça.
    J'en suis content car c'est le premier serveur que j'ai jamais fait (que ce soit en C ou dans un autre langage... je sais, c'est un peu puéril mais bon )

    Le serveur :
    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
    :- use_module(library(streampool)).
     
    server(Port) :-
            tcp_socket(Socket),
            tcp_bind(Socket, Port),
            tcp_listen(Socket, 5),
            tcp_open_socket(Socket, In, _Out),
            add_stream_to_pool(In, accept(Socket)),
            stream_pool_main_loop.
     
    accept(Socket) :-
            tcp_accept(Socket, Slave, Peer),
            tcp_open_socket(Slave, In, Out),
            add_stream_to_pool(In, client(In, Out, Peer)).
     
    client(In, Out, _Peer) :-
            read_line_to_codes(In, Command),
            close(In),
            format('Vous m''avez envoyé: ~s~n', [Command]),
            format(Out, 'Vous m''avez envoyé: ~s~n', [Command]),
            close(Out),
            delete_stream_from_pool(In).
     
    test :-
    	server(5000).
    Le client dans une autre session SWI-Prolog
    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
    create_client(Host, Port) :-
    	repeat,
            tcp_socket(Socket),
            tcp_connect(Socket, Host:Port),
            tcp_open_socket(Socket, ReadFd, WriteFd),
    	writeln('Tapez quelque chose, (stop pour cesser) '),
    	read(X),
    	format(WriteFd, '~w.~n', [X]),
    	flush_output(WriteFd),
    	read_line_to_codes(ReadFd, Lst),
    	string_to_list(Command, Lst),
    	writeln(Command),
            close(ReadFd),
            close(WriteFd),
    	X == stop.
     
    test :-
    	create_client('localhost', 5000).
    Exemple d'exécution

    Serveur :
    1 ?- test.
    Vous m'avez envoyé: sazlut.
    Vous m'avez envoyé: stop.
    Client
    1 ?- test.
    Tapez quelque chose, (stop pour cesser)
    |: sazlut.
    Vous m'avez envoyé: sazlut.
    Tapez quelque chose, (stop pour cesser)
    |: stop.
    Vous m'avez envoyé: stop.

    Yes
    PS : pour relativiser l'exploit, je tiens à dire que tout le code est pratiquement donné ici
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Salut

    Je ne sais pas où tu en es, moi, j'ai fait ça.
    J'en suis content car c'est le premier serveur que j'ai jamais fait (que ce soit en C ou dans un autre langage... je sais, c'est un peu puéril mais bon )

    Le serveur :
    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
    :- use_module(library(streampool)).
     
    server(Port) :-
            tcp_socket(Socket),
            tcp_bind(Socket, Port),
            tcp_listen(Socket, 5),
            tcp_open_socket(Socket, In, _Out),
            add_stream_to_pool(In, accept(Socket)),
            stream_pool_main_loop.
     
    accept(Socket) :-
            tcp_accept(Socket, Slave, Peer),
            tcp_open_socket(Slave, In, Out),
            add_stream_to_pool(In, client(In, Out, Peer)).
     
    client(In, Out, _Peer) :-
            read_line_to_codes(In, Command),
            close(In),
            format('Vous m''avez envoyé: ~s~n', [Command]),
            format(Out, 'Vous m''avez envoyé: ~s~n', [Command]),
            close(Out),
            delete_stream_from_pool(In).
     
    test :-
    	server(5000).
    Le client dans une autre session SWI-Prolog
    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
    create_client(Host, Port) :-
    	repeat,
            tcp_socket(Socket),
            tcp_connect(Socket, Host:Port),
            tcp_open_socket(Socket, ReadFd, WriteFd),
    	writeln('Tapez quelque chose, (stop pour cesser) '),
    	read(X),
    	format(WriteFd, '~w.~n', [X]),
    	flush_output(WriteFd),
    	read_line_to_codes(ReadFd, Lst),
    	string_to_list(Command, Lst),
    	writeln(Command),
            close(ReadFd),
            close(WriteFd),
    	X == stop.
     
    test :-
    	create_client('localhost', 5000).
    Exemple d'exécution

    Serveur :


    Client


    PS : pour relativiser l'exploit, je tiens à dire que tout le code est pratiquement donné ici
    Oui j'ai vu, mais sur la ML Prolog on m'a dit que c'était déprécié d'utiliser les streampool. J'essaye donc de faire sans. Tout ce que je souhaiterais avoir c'est le nom du flux standard de sortie pour pouvoir afficher ce que je veux avec write(), car ça n'a pas l'air de marcher sans.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je crois que j'ai trouvé quelque chose d'intéressant :

    SWI-Prolog utilise 4 noms prédéfinis
    current_input/output et user_input/output

    Au démarrage les 2 paires sont identiques (e.g. current_input = user_input et current_output = user_output)

    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
    test :-
    	% l'entrée par défaut est le fichier d:/src.txt
    	see('d:/src.txt'),
    	% la sortie par défaut est le fichier d:/but.txt
    	tell('d:/but.txt'),
    	% on lit une ligne du fichier d:/src.txt
    	read(X),
    	% on l'ecrit dans le fichier d:/but.txt
    	writeln(X),
    	% on affiche à l'écran ce qui a été lu et ecrit
    	format(user_output, 'ce qui a été lu : ~w~n', [X]),
    	% on va lire au clavier une ligne a écrire dans le fichier but.txt
    	write(user_output, 'tapez quelque chose : '),
    	read(user_input, Y),
    	writeln(Y),
    	% on ferme les deux fichiers
    	told,
    	seen.
    La session
    9 ?- test.
    ce qui a été lu : titi
    tapez quelque chose : chose.

    Yes
    Le fichier src.txt
    titi.
    tata.
    toto.
    Remarquez les . qui termine les lignes (à cause du read, on peut éviter en utilisant read_line_to_codes/2)
    Le fichier but.txt
    titi
    chose
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Le même code avec des read_line_to_codes qui évite les '.' de fin de saisie :
    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
    test :-
    	% l'entrée par défaut est le fichier d:/src.txt
    	see('d:/src.txt'),
    	% la sortie par défaut est le fichier d:/but.txt
    	tell('d:/but.txt'),
    	% on lit une ligne du fichier d:/src.txt
    	read_line_to_codes(current_input, X),
    	% on l'ecrit dans le fichier d:/but.txt
    	string_to_list(XX, X),
    	writeln(XX),
    	% on affiche à l'écran ce qui a été lu et ecrit
    	format(user_output, 'ce qui a été lu : ~w~n', [XX]),
    	% on va lire au clavier une ligne a écrire dans le fichier but.txt
    	write(user_output, 'tapez quelque chose : '),
    	read_line_to_codes(user_input, Y),
    	string_to_list(YY, Y),
    	writeln(YY),
    	% on ferme les deux fichiers
    	told,
    	seen.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Excellent ! C'est ce qu'il me fallait !

    beaucoup, au top comme d'habitude

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

Discussions similaires

  1. Désactiver les warnings en swi-prolog
    Par Cecilka dans le forum Prolog
    Réponses: 2
    Dernier message: 15/12/2006, 12h33
  2. Les flux non standard
    Par Philippe299 dans le forum C++
    Réponses: 14
    Dernier message: 30/07/2005, 00h56

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