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 PHP Discussion :

[Socket] Réponse à la requête POST


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut [Socket] Réponse à la requête POST
    Bonjour,

    Je suis en train de développer un programme php chargé de :
    • - ecouter sur le port 8061 de son propre serveur
      - récupérer des fichiers XML envoyés par requête HTTP POST sur ce port
      - analyser et traiter ces fichiers
      - renvoyer un fichier XML de retour par réponse à la requête POST

    J'ai déja validé les 3 premiers points, mais je bloque sur le dernier : je ne sais pas comment renvoyer un fichier dans la réponse même de la requête.

    Merci de votre aide.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Re: Réponse à la requête POST
    fait nous voir un peu de ton code pour qu'on puisse t'aider.

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    Voici le code du programme qui une fois lancé attend la réception d'un flux sur le port 8061 (sachant que le serveur HTTP tourne sur le port 80) :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    <?
    // Autorise l'exécution infinie du script, en attente de connexion.
    set_time_limit(0);
     
    // Active le vidage implicite des buffers de sortie, pour que nous
    // puissions voir ce que nous lisons au fur et à mesure.
    ob_implicit_flush();
     
    //$address = '192.0.1.42';
    $address = '192.168.1.15';
    $port = 8061;
    $ip = $_SERVER["REMOTE_ADDR"];
     
    // Crée la socket
    if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
       echo "socket_create() a échoué : raison : " . socket_strerror($sock) . "\n";
    }
     
    // Lie un nom à la socket
    if (($ret = socket_bind($sock, $address, $port)) < 0) {
       echo "socket_bind() a échoué : raison : " . socket_strerror ($ret) . "\n";
    }
     
    // Ouvre la socket sur le port
    if (($ret = socket_listen($sock, 5)) < 0) {
       echo "socket_listen() a échoué : raison : " . socket_strerror ($ret) . "\n";
    }
     
    // Accepte la connexion
    if (($msgsock = socket_accept($sock)) < 0) {
       echo "socket_accept() a échoué : raison : " . socket_strerror ($msgsock) . "\n";
    }
     
    // Crée la socket
    if (false === ($buf = socket_read($msgsock, 2048))) {
       echo "socket_read() a échoué : raison : " . socket_strerror ($ret) . "\n";
    }
     
    socket_close($msgsock);
    socket_close($sock);
     
    // On définit les chemins
    $uploadpath = 'C:\\Inetpub\\wwwroot\\winpharma\\tests\\final\\tmp\\';
    $name = 'commande.xml';
    $fichier=$uploadpath.$name;
     
    // Ecriture du flux dans un fichier
    if(!is_dir($uploadpath)) mkdir($uploadpath); // On vérifie si le répertoire existe
    $fp = fopen($fichier,"w");
    $pos = strrpos($buf, "<?xml");
    $xml = substr($buf,$pos);
    fputs($fp, $xml);
    fclose($fp);
     
    // Chargement du fichier
    $dom_=new DOMDocument();
    $dom_->load($fichier);
    if(!$dom_){
    	echo'Erreur ouverture fichier<br>';
    	exit;
    }else{
     
    	$st=$dom_->saveXML();
     
    	include("winpharma/tests/final/xmlrpc.inc");
     
    	//connexion au serveur
    	$client=new xmlrpc_client("/winpharma/tests/final/serveur.php", "192.0.1.42", 80);
     
    	//mode de debug désactivé pour l'activer enlever le commentaire ci-dessous
    	//$client->setDebug(1);
     
    	//début traitement commande
    	$message0=new xmlrpcmsg('supprimerTemp', array(new xmlrpcval($name)));
    	$Reponse0=$client->send($message0);
     
    	if(($Reponse0->faultCode())==0){		//succès
    		$valeur = $Reponse0->serialize();
    		//echo 'Réponse : '.$valeur;
    	}else{
    		//echo 'Erreur : '.$Reponse0->faultString();
    	}
     
    	$message2=new xmlrpcmsg('enregistreXML', array(new xmlrpcval($name), new xmlrpcval($st)));
    	$Reponse2=$client->send($message2);
    	$nomfichimport="";
     
    	if(($Reponse2->faultCode())==0){		//succès
    		$valeur = $Reponse2->serialize();
    		$resp=explode("|",$valeur);
    		$tmp=explode("<",$resp[1]);
    		$nomfichimport=$tmp[0];
    		$name=$resp[2];//a ver
    		//echo '<br>Réponse : '.$resp[0];
    	}else{
    		//echo '<br>Erreur : '.$Reponse2->faultString();
    		exit;
    	}
     
    	$message1=new xmlrpcmsg('test.connexion', array(new xmlrpcval($ip), new xmlrpcval($name)));
    	$Reponse1=$client->send($message1);
     
    	if( ($Reponse1->faultCode())==0){		//succès
    		$valeur = $Reponse1->serialize();
    		//echo '<br>Réponse : '.$valeur;
    	}else{
    		//echo '<br>Erreur : '.$Reponse1->faultString();
    	}
     
     
    	//Affichage du retour XML
      echo $resp[3];
     
    }
    ?>
    Comme on peut le voir à la dernière ligne, j'ai essayé d'afficher le flux retour sur la sortie standard mais je me suis rendu compte que je dois construire moi-même la réponse HTTP pour la renvoyer.

    Je bloque donc sur ce renvoi : comment procéder sachant que mon programme va recevoir des requêtes multiples venant de clients différents ???

    Existe t-il une méthode en php pour envoyer automatiquement une réponse HTTP par rapport à une requête spécifique?

  4. #4
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    Tu peux utiliser : PEAR::HTTP_Client pour envoyer des requêtes POST sur une adresse spécifique.
    (si tu fais une recherche sur ce forum, tu trouveras des exemples. Sinon tu peux aller voir sur le site PEAR)

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    Merci de vos réponses, j'ai fini par trouver !

    Finalement comme souvent la solution était simplissime :

    il fallait faire un socket_write :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <?
     
    // Autorise l'exécution infinie du script, en attente de connexion.
    set_time_limit(0);
     
    // Active le vidage implicite des buffers de sortie, pour que nous
    // puissions voir ce que nous lisons au fur et à mesure.
    ob_implicit_flush();
     
    //$address = '192.0.1.42';
    $address = '192.168.1.15';
    $port = 8061;
     
    // Crée la socket
    if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
       echo "socket_create() a échoué : raison : " . socket_strerror($sock) . "\n";
    }
     
    // Lie un nom à la socket
    if (($ret = socket_bind($sock, $address, $port)) < 0) {
       echo "socket_bind() a échoué : raison : " . socket_strerror ($ret) . "\n";
    }
     
    // Ouvre la socket sur le port
    if (($ret = socket_listen($sock, 5)) < 0) {
       echo "socket_listen() a échoué : raison : " . socket_strerror ($ret) . "\n";
    }
    // Accepte la connexion
    if (($msgsock = socket_accept($sock)) < 0) {
       echo "socket_accept() a échoué : raison : " . socket_strerror ($msgsock) . "\n";
    }
     
    //Envoi du retour XML
    $contentLength = strlen($ma_chaine);
     
    $send = "HTTP/1.1 200 OK";
    $send .= "Content-Type: text/xml; charset=utf-8\r\n";
    $send .= "Content-Length: " . $contentLength . "\r\n\r\n";
    $send .= $ma_chaine;
    $send .= "\r\n";
     
    socket_write($msgsock, $send, strlen($send));
    socket_close($msgsock);
    socket_close($sock);
     
    ?>
    Par contre je voudrais savoir comment éviter de relancer le serveur à chaque fois!
    Je pense qu'une boucle du style while(true){bla bla} devrait faire l'affaire mais je ne sais pas à quel niveau?? Je pencherais pour une boucle autour du socket_accept()...

    Qu'en pensez-vous?
    Merci d'avance!

Discussions similaires

  1. Réponse d'une requête POST JSON
    Par mailoy dans le forum Android
    Réponses: 7
    Dernier message: 18/05/2015, 10h44
  2. Acquitter une requête POST sur la même connexion
    Par phaby dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2006, 10h59
  3. [XML] Réponse à la requête POST VIA XML
    Par cilv1 dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 01/02/2006, 11h18
  4. Comment envoyer une requête POST via HTTP ?
    Par pdtor dans le forum C++
    Réponses: 2
    Dernier message: 13/09/2005, 05h54
  5. Analyse de code HTML en réponse a une requête post.
    Par ghost942 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 04/06/2005, 21h40

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