Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Recherche information/tutoriel: comment programmer un serveur http Qt

Bonjour à toutes et à tous

Pour ceux qui sont déjà tomber sur mes anciens posts, vous savez sans doute que j'essaie (tant bien que mal, même s'il y a plus de mal) de déporter mon IHM Qt sur une page web. En gros, lorsque je clique sur un bouton de ma page web, cela lance une fonction correspondante dans mon programme Qt.
Par exemple sur mon IHM Qt, j'avais un bouton qui, lorsque j'appuis dessus, m'allume une LED. Ba là, le bouton sera sur une page web et lorsque l'on appuie dessus, ça allume la LED.

Déjà, je tiens à le dire, je galère vraiment, je ne trouve pas d'exemple d'application pour ce que je veux faire et pourtant je pense que cela est plus courant que ce que l'on pense (donc si vous avez des infos, je suis preneur).

Ensuite, après quelques discussions, j'ai compris que dans mon programme, il fallait que j'ajoute une partie "serveur" qui récupérera les ordres en provenance de la page web et les transmettra à mon programme pour qui les exécute. Mais voilà mon souci (que l'on m'a fait judicieusement remarquer): une page web utilise le protocole HTTP et jusqu'à présent, je n'ai vu que des codes pour programmer un serveur TCP sous Qt.

Le réseau, c'est pas mon point fort, mais je suppose qu'avoir un serveur HTTP n'est pas la même chose qu'avoir un serveur TCP et qui ne doivent pas fonctionner/traiter les choses de la même façon. D'où ma question: Connaissez-vous des docs ou des tutoriels qui me permettraient d'apprendre comment programmer un serveur HTTP sous Qt ?


Il se peut que je me trompe totalement et qu'au final, un serveur TCP suffit à faire la même chose qu'un serveur HTTP donc n'hésitez pas à me corriger et à me conseiller

Cordialement,
Clairetj

Réponses

  • October 2013 modifié
    J'ai trouvé ce lien dans un topic ici même datant de 2011: http://doc.qt.digia.com/solutions/4/qtservice/qtservice-example-server.html … erver.html

    Par contre je dois dire que je trouve le code assez ... bizarre. j'ai l'impression (c'est ce que je comprend en lisant le code) que le code ce résume en un fichier .h et que tout a été écrit dedans. ce qui doit ce trouvé dans un fichier .h (logique me direz-vous) mais aussi ce que moi je met dans un fichier .cpp

    Donc, (pour la culture) est-ce qu'on peut faire ça ? Si oui et si je veux utiliser ce code, je n'ai donc à faire qu'un fichier .h ?
  • Bonsoir !

    Ton lien n'est pas bon, corrige-le pour que nous sachions de quoi tu parles.
  • Salut,

    Pour ta question concernant le fichier .h regarde ceci. Ton lien ne marche pas donc je ne sais pas si cela correspond.

    J'avais tenté de faire un serveur Http, c'est pas bien compliqué en théorie. J'avais un QTcpServer qui écoutait sur le port 80, puis chaque fois que le navigateur envoyait une requête la socket s'occupait de parser les en-têtes et le contenu si il y en avait un, ensuite j'envoyais ça sur un autre programme en tcp qui lui traiter les informations un peu comme Php, etc...

    Si tu as le temps, télécharge la rfc 2616(il existe une traduction française au cas ou), c'est une mine d'or sur le protocole http 1.1, notamment comment un requête est construite, a quoi correspond les headers, etc... Tu n'es pas obligé d'implémenter tout le protocole, juste se dont tu as besoins.
  • normalement j'ai corrigé, j'ai mis le bon lien
  • midoriiro said:

    J'avais tenté de faire un serveur Http, c'est pas bien compliqué en théorie. J'avais un QTcpServer qui écoutait sur le port 80, puis chaque fois que le navigateur envoyait une requête la socket s'occupait de parser les en-têtes et le contenu si il y en avait un, ensuite j'envoyais ça sur un autre programme en tcp qui lui traiter les informations un peu comme Php, etc...

    Moi en faite, ce que je cherche à faire, c'est envoyer un ordre depuis une page web (http donc) que mon serveur récupère l'ordre et qu'il dise au programme associé "fait ça" donc est-ce que c'est un peu dans l'idée de ce que tu as réaliser ?
  • Oui exactement, le serveur http fera la passerelle entre la page web et le programme qui contrôlera tes LED. Par contre si ta page web est distante ce sera un poil plus compliqué à mettre en place du fait que le serveur web doit généré la page html, l'envoyé avant de recevoir une réponse et la traiter.
  • midoriiro said:
    Oui exactement, le serveur http fera la passerelle entre la page web et le programme qui contrôlera tes LED. Par contre si ta page web est distante ce sera un poil plus compliqué à mettre en place du fait que le serveur web doit généré la page html, l'envoyé avant de recevoir une réponse et la traiter.
    En faite le tout sera embarqué sur une carte raspberry Pi, dans gros sur cette carte il y aura
    -mon gros projet qt pour la création/gestion de la communication et le serveur http
    -le code html de la page web

    La raspberry Pi sera connecté à mon automate via une liaison série (d'où mon programme Qt) et à internet.
  • Par contre avec ma solution tu ne pourra pas utiliser d'autre serveur web du fait que le port 80 sera utilisé ou alors utilise un autre port(8080/443).

    Juste par curiosité la page html est statique ou dynamique?
  • midoriiro said:
    Juste par curiosité la page html est statique ou dynamique?

    On va dire que je n'ai que de vague connaissance en html/php/css vu que j'ai juste appris le langage et comment faire un site web sur openclassrooms (anciennement le site du zéro) donc est-ce que tu peux me préciser la différence entre statique et dynamique et je tachera de te répondre (je dois vraiment passer pour un boulet de la programmation à vos yeux)
  • Ne t’inquiète pas pour ma part je suis loin de me considérer comme un dieu de la programmation :D. Et puis j'aime à penser que je suis et resterai toujours un débutant tant les domaines en informatique sont vastes ^^.

    Une page html statique pour moi c'est une page écrite à la main, alors que dynamique avec l'aide d'un moteur de template(php ou autre langage).
  • midoriiro said:
    Une page html statique pour moi c'est une page écrite à la main, alors que dynamique avec l'aide d'un moteur de template(php ou autre langage).
    Sa te choque si je te dit un mixte des deux ??? ^^
    Par exemple moi pour mon site web, je suis parti d'un template pour avoir ma base (le corps, taille des titres, forme du menu, mise en page, etc ...) Par contre derrière (vu que j'utilise notepad++ et wamp pour tester avant toute mise en ligne) je trifouille le code pour ajouter/enlever/modifier des trucs, je vais dans le fichier .css pour créer/modifier de nouvelle chose etc ...

    Mais à proprement parler, vu que je n'utilise que notepad++ et wamp, je dois rentrer dans la catégorie statique
  • Oui effectivement c'est du statique ^^. Je viens de penser a un truc pour ton problème initial, une utilisation des sockets php pourrait faire l'affaire.

    Tu as ta page html avec ton bouton dans un formulaire, ce formulaire renvoie vers une page php(donc hébergé sur le même site) qui s'occupe de traiter les informations relatives au form. Dès que le tout est prêt, tu envois les données de la socket php vers le programme qui contrôle les LED. C'est juste une idée, mais ça permettra d'utiliser un serveur http plus robuste(qui fera office de passerelle et aussi d’hébergeur) et puis cela restera cohérent avec l'IHM Web AMHA.

    Faut juste voir les conditions d'utilisation des sockets php, c'est loin le temps de php ^^".
  • J'avais commencé à préparer mon IHM Web et donc par exemple j'ai mis ça pour faire les bouton sur ma page web:

    <form action="" method="GET">
    <input type="submit" style="width:200px" name="LED1" value="LED1">
    </form>
    donc si je suis ton raisonnement, lorsque j’appuie sur ce genre de bouton (je suppose que dans l'état je n'envoie rien), sa renvoie vers une page php et dernière envoie l'ordre via socket php vers un serveur TCP que j'aurai programmer dans mon application (et sur lequel j'aurais ouvert une socket) et recevra l'ordre à exécuter.

    Question subsidiaire: sur ma carte raspberry Pi (je ne sais pas si tu connais) j'ai la possibilité d'installer un serveur web embarqué nommé lighttpd. Donc est-ce que j'en aurais besoin pour "héberger" toute mon application+site web+page php où alors le serveur que je vais programme dans mon application s'en charge ?

  • donc si je suis ton raisonnement, lorsque j’appuie sur ce genre de bouton (je suppose que dans l'état je n'envoie rien), sa renvoie vers une page php et dernière envoie l'ordre via socket php vers un serveur TCP que j'aurai programmer dans mon application (et sur lequel j'aurais ouvert une socket) et recevra l'ordre à exécuter.
    Dans le cas d'un serveur http fait maison c'est le bon raisonnement.

    Question subsidiaire: sur ma carte raspberry Pi (je ne sais pas si tu connais) j'ai la possibilité d'installer un serveur web embarqué nommé lighttpd. Donc est-ce que j'en aurais besoin pour "héberger" toute mon application+site web+page php où alors le serveur que je vais programme dans mon application s'en charge ?
    lighttpd(je connais que de nom) fait la même change que apache2, c'est à dire d’héberger des sites sur une même machine. En fait faut que tu dissocie ton application web de ton application Qt, ce n'est pas la même chose. lightttpd s'occupera uniquement de répondre a la requête de ton navigateur(lorsque tu veux accéder a ton ihm via chrome ou autre). lighttpd reçois des requêtes et envoie le contenue suivant celle-ci, majoritairement du texte(html, css, js) et des images et lorsque il reçoit un requête avec comme référence un script php il exécute php en lui fournissant le script nécessaire, grosso modo.
    C'est ce script qui est important, le script ouvre une socket sur un port quelconque et en envoi les données de ton formulaire, LED1 par exemple.

    C'est tout pour la partie web. Ton programme Qt lui écoutera sur le port que tu aura renseigné dans le script php, et fera ce que tu lui demandera ^^.


    Sinon tu as la première solution de créer un serveur http, mais en y réfléchissant bien ça demande beaucoup de travail(mais rien ne t’empêche de te lancer, c'est très formateur ^^) pour "juste" une ihm et tu as les contraintes techniques. Je m'explique, déjà tu auras ton port 80 de bloqué si tu souhaite utiliser un serveur web en parallèle(je pense qu'en bidouillant un peu la config du serveur il y a moyen de changer le port, a voir comment tu comptes rendre accessible le serveur), il faudra gérer les virtual host(et c'est pas facile croit moi :D) si tu souhaites pouvoir héberger plusieurs sites/ihm.

    Faut que tu vois si ton RPi te servira uniquement pour ton projet ou si tu comptes faire une utilisation plus avancée d'un serveur web.

    Je sais pas si j'ai été clair :p.
  • Je suis un peu pressé alors je n'ai lu ce nouveau post qu'en diagonale..mais va voir sur ce site, il y a des exemples qui correspondent ce que tu veux faire:
    http://raspberrywebserver.com/
  • La bibliothèque d'extension de Qt, Qxt, contient quelques services Web utilisables directement ou à placer derrière un autre serveur (ainsi qu'un client/serveur RPC qui sont relativement facile à interfacer avec Php, ruby ou python).
  • alexisdm said:
    La bibliothèque d'extension de Qt, Qxt, contient quelques services Web utilisables directement ou à placer derrière un autre serveur (ainsi qu'un client/serveur RPC qui sont relativement facile à interfacer avec Php, ruby ou python).

    Est-ce que tu aurait un site web avec une doc ou un tutoriel à me conseiller ???
  • Même s'il est difficile à voir, j'avais mis le lien de Qxt...

    La doc se trouve là: http://libqxt.bitbucket.org/doc/tip/ et il n'y a apparemment qu'un seul exemple pour ce type de service (qui fait partie de l'archive de la bibliothèque): http://dev.libqxt.org/libqxt/src/9068e83def488d9e3bcdb734cf242ce64c024214/examples/web?at=master

    La classe utilisée dans l'exemple, QxtWebSlotService devrait être suffisante pour ce que tu veux en faire, il y a aussi QxtHtmlTemplate pour faire des pages presque dynamiques (ça ne fait qu'un remplacement à partir d'une table statique, donc tu ne peux pas mettre de code dans le template lui-même).

    PS: Pour ton exemple de formulaire, il faudrait une requête POST et pas GET. Et avec QxtWebSlotService, la méthode est passée dans l'attribut method de l'event en paramètre du slot (je précise ça aussi, parce que la doc est incomplète et cet attribut ne figure pas sur la page de QxtWebRequestEvent, par contre il apparaît sur la page qui liste ses membres)
  • November 2013 modifié
    Nouvelle question: en ayant fait des recherches sur internet, j'ai lu quelque chose qui peut-être pourrait marcher mais avant de vous dire ce que j'ai trouver, un petit état des lieux pour comprendre où je veux en venir.
    Actuellement j'ai à ma disposition pour phase de développement:
    -mon programme développé sous Qt qui me fait ma communication série entre mon PC et mon automate
    -notepad++ et wampserver pour la rédaction de ma page html qui me servira d'interface

    Ce que j'aurais après la phase de développement:
    -mon programme développé sous Qt qui me fait ma communication série entre mon PC et mon automate
    -une carte raspberry PI avec comme OS un linux embarqué et un serveur lighttpd


    du coup en ayant cela, on peut dire que j'ai déjà un serveur qui me sert aussi d'hébergeur.
    Donc ne serait-il pas plus simple d'utiliser des script CGI pour faire ma passerelle entre ma page web et mon programme ??? (ps: je ne m'y connait pas non plus en scripts CGI)
    Ou dois-je obligatoirement programmer un serveur HTTP ???
  • November 2013 modifié
    bin justement tu as des exemples d'utilisation de cgi (c'est ce que j'utiliserai dans ton cas) sur le site dont je t'ai donné le lien. As tu regardé?
  • zodd said:
    bin justement tu as des exemples d'utilisation de cgi (c'est ce que j'utiliserai dans ton cas) sur le site dont je t'ai donné le lien. As tu regardé?

    Non j'ai pas encore regardé ton site, j'y vais de ce pas. En fait, en cherchant sur internet comment réaliser mon serveur HTTP, ils parlaient à des moments de scripts CGI donc j'ai regardé et en gros si j'ai bien compris, ce sont des "programmes" qui permettent exécuter un programme quelconque (donc par exemple le mien) se trouvant sur la même machine que le serveur.

    Par contre, ce que je n'arrive pas à comprendre, c'est est-ce qu'il faut recréer (ou créer) un serveur HTTP en plus ou alors celui "d'origine" (par exemple wampserveur lorsque je développe en local) est suffisant ???
  • oui il faut un serveur http, et donc un "site" avec des page en html et des fichiers .cgi associés à ces pages. Je m'en suis servit il y a longtemps sur micro contrôleur et je m'en servait pour déclencher des actions , afficher des informations, etc .. c'est assez simple à programmer et pour le raspi, j'ai regardé vite fait, mais sur le site que je t'ai donné, tu devrais trouver ton bonheur.
  • November 2013 modifié
    Mais du coup, j'ai pas besoin de recréer un serveur dans mon programme Qt ??? Par exemple sur ma raspberry Pi je vais avoir un serveur lighttpd (http://fr.wikipedia.org/wiki/Lighttpd), du coup est-ce que j'ai besoin d'en recréer un autre ou bien celui-là me suffira ???

    J'ai regarder le site que tu m'as donné, le problème c'est que tous les scripts sont écris en Python, et je ne connait pas le Python
  • bah il va pas te mordre le Python :P

    Et non je ne pense pas que tu ai besoin de faire un serveur avec Qt... Ensuite Python c'est assez simple grâce à tout les exemples que l'on trouve.. ça ne m'étonnerai pas qu'il y ai déjà un truc limite tout prêt pour ce que tu veux faire..
  • zodd said:
    Et non je ne pense pas que tu ai besoin de faire un serveur avec Qt... Ensuite Python c'est assez simple grâce à tout les exemples que l'on trouve.. ça ne m'étonnerai pas qu'il y ai déjà un truc limite tout prêt pour ce que tu veux faire..

    Donc actuellement, mon programme tel qu'il est, je n'ai normalement plus besoin d'y retoucher et je dois faire mes scripts CGI
  • voilà c'est pas beau ça ? 8o
  • Par contre quelque chose me chiffonne, je ne comprend pas où je dois écrire mon (mes) scripts CGI. Est-ce que je crée un nouveau fichier sur notepad par exemple, que je tape tout dedans et j'enregistre en .cgi ou est-ce que c'est un truc à rajouter dans mon projet ???
  • Lorsque j'avais été amené à le faire, j'avais un fichier .cgi dans le même répertoire que mon index.htm.. (je ne sais pas si ça t'aide.. )
Connectez-vous ou Inscrivez-vous pour répondre.