PHP e Python: connessione tramite socket

Data: 17 Novembre 2006
Autore: Maurizio Pelizzone
python  php

Mettiamo caso che ci sia un gestionale con un server scritto in python in ascolto su una porta predefinita ( es. 12345 ).

Mettiamo caso che i client all’interno della rete si connettano senza problemi ma un firewall sia configurato per filtrare tutti tentativi di connessione al di fuori della porta 80 ( vedi webserver )

Mettiamo caso da un pagina web scritta in php si voglia interagire con il gestionale interrogandolo sullo stato di ordini, bolle, fatture, automatizzare la preparazione di alcune stampe e si voglia anche avere la possibilità di inviare un ordine. Tutto questo cercando di mantenere un adeguato livello di sicurezza.

Mettiamo caso che l’accesso diretto alla base dati ( PostgreSQL ) anche se possibile sia sconsigliata in quanto il gestionale ha degli automatismi che sarebbe inutile riportare in php.

Soluzione adottata: usare direttamente i socket sul webserver tramite php, e servirsi di un protocollo di comunicazione basato su http e xml ( aka REST )

Definizione del protocollo a parte ( di cui vi parlarò un altra volta ) il problema “PHP Socket Client” è risolto in poco più di 10 righe di codice:

  1. <?php
  2. $host="localhost" ;
  3. $port=12345;
  4. $timeout=30;
  5. $sk=fsockopen($host,$port,$errnum,$errstr,$timeout) ;
  6. if (!is_resource($sk)) {
  7.     exit("connection fail: ".$errnum." ".$errstr) ;
  8. } else {
  9.     fputs($sk, "hello world") ;
  10.     $dati="" ;
  11.     while (!feof($sk)) {
  12.         $dati.= fgets ($sk, 1024);
  13.     }
  14. }
  15. fclose($sk) ;
  16. echo($dati) ;
  17. ?>

Le operazioni da fare sono abbastanza ovvie; dopo la definizione dei parametri tentiamo di aprire la connessione ( riga 5 ), e se tutto va bene mandiamo un pacchetto di dati ( riga 9 ) per poi rimanere in attesa della risposta del server ( il timeout è stato precedentemente impostato ).

Per finire chiudo la connessione e stampo quanto ricevuto dal server.

Se volete fare qualche esperimento vi lascio anche il sorgente per un “Socket Server” minimale scritto in python.

  1. import socket
  2. host = "localhost"
  3. port = 12345
  4. threads = 1
  5. start_server = False
  6. try:
  7.     SocketServer = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
  8.     SocketServer.bind ( ( host , port ) )
  9.     SocketServer.listen ( threads )
  10.     start_server = True
  11. except e:
  12.     print "server error"
  13.     print e
  14. while start_server:
  15.     channel, details = SocketServer.accept()
  16.     print 'open ', details
  17.     conn_active = True
  18.     while conn_active:
  19.         data = channel.recv ( 1024 )
  20.         print "-----------------------------"       
  21.         print "receive"
  22.         print "-----------------------------"       
  23.         print data
  24.         print "-----------------------------"
  25.         if (data != "quit"):
  26.             channel.send ( data )
  27.             channel.send ( 'receive' )
  28.             channel.close()
  29.             break
  30.         else:
  31.             print "close" , details
  32.             channel.send ( 'connection closed' )
  33.             channel.close()
  34.             conn_active = False
  35.             start_server = False

Per l’implementazione del protocollo REST vi rimando alla prossima puntata … :)

Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • digg
  • co.mments
  • De.lirio.us
  • Fark
  • Furl
  • NewsVine
  • Reddit
  • Smarking
  • Spurl
  • Segnalo
  • OKNOtizie
  • Taggly

Questo articolo è stato pubblicato il 17 Novembre 2006 alle 11:34 pm ed è stato letto 10515 volte
Archiviato sotto sviluppo, python, php.

Se questo post ti è piaciuto puoi iscriverti al mio Feed Rss e ricevere direttamente gli aggiornamenti di questo blog sul tuo FeedReader oppure puoi decidere di offrirmi un caffè.
Se ti va puoi lasciare un commento e leggere quelli degli altri, ma se preferisci puoi passare direttamente al post precedente o a quello successivo.


Forse collegati ..

  • Python 2.5 (final) is now available
    Phython è giunto al rilascio definitivo della sua major release. Molte sono le novità introdotte di cui possiamo leggere il dettaglio
  • PyCon Uno: Python 3000
    Giovanni Bajo ha preparato panoramica sul progetto Python 3000 (alias Python 3.0) che ha appena raggiunto lo stato di feature-freeze.
  • PyconUno: conferenza italiana dedicata a Python
    Update 15 maggio 2006: la discussione prosegue anche su altri spazi. Aggiungo che ad oggi gli risultano presenti alcuni sponsor, e
  • links for 2006-01-04
    Mini guida all’uso dei Feed RSS e Atom RSS è universalmente considerato l’acronimo di Really Simple Syndication (o di Rich Site
  • floating point, questo sconosciuto ...
    per un cliente ho sviluppato alcune procedure in python che vanno a calcolare il "calo di lavorazione"; in pratica dal

Un Commento per “PHP e Python: connessione tramite socket”

  1. Non è che potresti commentare le righe 7,8,9 del python?

    Per il php, io un accrocchio del genere l’ho dovuto usare per attivare account per un server di ultima online, soltanto che ci si collegava ad un telnet, non ti dico il casino per cacciare l’output giusto.

Lascia un messaggio