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

Réseau/Web Python Discussion :

Socket HTTP avec intégration de données XML


Sujet :

Réseau/Web Python

  1. #1
    Futur Membre du Club
    Inscrit en
    juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut Socket HTTP avec intégration de données XML
    Bonjour à tous.

    J'aimerai créer une socket serveur qui :

    => écoute sur son IP et le port 8060 les trames de type :
    • GET / HTTP/1.1
    • Host: MON_IP : 8060

    => et réponds par une trame de type :
    • HTTP/1.1 200 OK
    • contenant des informations spécifiques dans le header ainsi qu'en intégrant des données xml


    J'ai mis en PJ un exemple de ce que je cherche à reproduire...

    Concernant le code, j'ai pioché sur Internet ce qui pouvait m'intérésser, notamment que çà soit en mode Thread.

    Le code est le suivant :

    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
    116
    117
    118
    119
    120
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    
    # Importation des modules
    import sys
    import argparse
    import getopt
    import threading
    import socket
    import urllib2
    
    
    # Déclaration de l'IP de de l'addresse d'écoute
    SCRIPT = __file__
    HOST = ''
    PORT = ''
    
    
    # Fonction affichant le menu d'aide
    def usage():
    
    	# Création d'un parser avec description et epilogue pour un exemple
    	parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
    			 description="Parameters required for " + SCRIPT + " script...",
    			 epilog="Example :\npython " + SCRIPT + " -s 192.168.1.1 -p 8000\r\n\r\n")
    
    	# Ajout des arguments possibles
    	parser.add_argument('-s', '--src-ip', action = 'store_true', help='Source IP address')
    	parser.add_argument("-p", '--src-port', action = 'store_true', help="Source port")
    
    	# On parse les arguments
    	args = parser.parse_args()
    
    	# On affiche le résultat
    	print(args.echo)
    
    
    # Fonction validant les paramètres d'entrée
    def check_arguments(argv):
    
    	# Récupération des variables globales
    	global HOST
    	global PORT
    
    	# Gestion d'erreur
    	try :
    		opts, args = getopt.getopt(argv,"h:s:p:", ["help", "src-ip=", "src-port="])
    	except getopt.GetoptError :
    		usage()
    		sys.exit(2)
    
    	# Sauvegarde des paramètres
    	for opt, arg in opts :
    		if opt in ('-h', '--help'):
    			usage()
    			sys.exit(2)
    		elif opt in ('-s', '--src-ip'):
    			HOST = arg
    		elif opt in ('-p', '--src-port'):
    			PORT = int(arg)
    
    	# Vérification qu'aucun des paramètres ne soit vide
    	if HOST == "" or PORT == "" :
    		if HOST == "" :
    			print "\nAddresse IP d'écoute non renseignée...\n"
    		if PORT == "" :
    			print "\nPort d'écoute non renseigné...\n"
    		sys.exit(2)
    
    # Déclaration de la classe
    class ClientThread(threading.Thread):
    
    	# Objet thread gérant la réception des nouvelles connexions
    	def __init__(self, ip, port, clientsocket):
    
    		threading.Thread.__init__(self)
    		self.ip = ip
    		self.port = port
    		self.clientsocket = clientsocket
    		print ("Connexion entrante depuis %s sur son port %s" % (self.ip, self.port, ))
    
    	# Réponse du serveur
    	def run(self): 
    
    		# C'est là ou çà coince
    		#
    		# XXXX
    		#
    		#
    
    		print ("Déconnexion du client %s..." % (self.ip))
    
    # Démarrage du programme
    if __name__ == "__main__":
    
    	# Validation des paramètres d'entrée
    	check_arguments(sys.argv[1:])
    
    	# Création d'une socket TCP IPV4
    	tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    	# Ajout de l'option SO_REUSEADDR afin de rendre immédiatement le port disponible après utilisation
    	tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
    	# On bind la socket sur l'IP et PORT demandés
    	tcpsock.bind((HOST,PORT))
    
    	# Bloucle continue
    	while True:
    
    		# Ecoute avec une file d'attente maximale de 5 connexions
    		tcpsock.listen(5)
    
    		# Accepte la connexion, en récupérant les informations de l'émetteur
    		(clientsocket, (ip, port)) = tcpsock.accept()
    
    		# Création de l'objet thread pour gérer la connexion
    		newthread = ClientThread(ip, port, clientsocket)
    		newthread.start()

    J'ai essayé pas mal de bout de code avec la commande urllib2.Request / urllib2.openurl, mais je n'arrive pas à reproduire la trame...

    Vous auriez une idée, une piste, un tuto ???

    Particularité, je suis obligé de rester sur une version python 2.7.

    Merci pour votre aide.
    Images attachées Images attachées  

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    14 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 14 476
    Points : 24 494
    Points
    24 494
    Par défaut
    Salut,

    Citation Envoyé par dammex Voir le message
    J'ai essayé pas mal de bout de code avec la commande urllib2.Request / urllib2.openurl, mais je n'arrive pas à reproduire la trame...

    Vous auriez une idée, une piste, un tuto ???
    Je ne suis pas sûr de bien comprendre "je n'arrive pas à reproduire la trame..." mais vous pourriez essayez d'installer requests (dispo sur 2.7) qui vient avec un bon tuto.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Inscrit en
    juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Je ne suis pas sûr de bien comprendre "je n'arrive pas à reproduire la trame..." mais vous pourriez essayez d'installer requests (dispo sur 2.7) qui vient avec un bon tuto.

    - W
    C'est vrai je ne suis pas très clair...

    En gros, je voudrais pouvoir envoyer une requête HTTP/1.1 201 OK avec du contenu XML lorsqu'une requête GET / HTTP/1.1 est reçue.

    Du coup, j'ai mis à jour mon code en intégrant quelques modifications et notament "requests", toujours sans résultat

    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
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    
    # Importation des modules
    import sys
    import argparse
    import getopt
    import threading
    import socket
    import urllib2
    import requests
    
    
    # Déclaration des variables
    SCRIPT = __file__
    HOST = ''
    PORT = ''
    ROKU_GENERAL_XML = "/home/maint/Bureau/SCRIPTS/roku_general.xml"
    
    
    # Fonction affichant le menu d'aide
    def usage():
    
    	# Création d'un parser avec description et epilogue pour un exemple
    	parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
    			 description="Parameters required for " + SCRIPT + " script...",
    			 epilog="Example :\npython " + SCRIPT + " -s 192.168.1.1 -p 8000\r\n\r\n")
    
    	# Ajout des arguments possibles
    	parser.add_argument('-s', '--src-ip', action = 'store_true', help='Source IP address')
    	parser.add_argument("-p", '--src-port', action = 'store_true', help="Source port")
    
    	# On parse les arguments
    	args = parser.parse_args()
    
    	# On affiche le résultat
    	print(args.echo)
    
    
    # Fonction validant les paramètres d'entrée
    def check_arguments(argv):
    
    	# Récupération des variables globales
    	global HOST
    	global PORT
    
    	# Gestion d'erreur
    	try :
    		opts, args = getopt.getopt(argv,"h:s:p:", ["help", "src-ip=", "src-port="])
    	except getopt.GetoptError :
    		usage()
    		sys.exit(2)
    
    	# Sauvegarde des paramètres
    	for opt, arg in opts :
    		if opt in ('-h', '--help'):
    			usage()
    			sys.exit(2)
    		elif opt in ('-s', '--src-ip'):
    			HOST = arg
    		elif opt in ('-p', '--src-port'):
    			PORT = int(arg)
    
    	# Vérification qu'aucun des paramètres ne soit vide
    	if HOST == "" or PORT == "" :
    		if HOST == "" :
    			print "\nAddresse IP d'écoute non renseignée...\n"
    		if PORT == "" :
    			print "\nPort d'écoute non renseigné...\n"
    		sys.exit(2)
    
    # Déclaration de la classe
    class ClientThread(threading.Thread):
    
    	# Objet thread gérant la réception des nouvelles connexions
    	def __init__(self, ip, port, clientsocket):
    
    		threading.Thread.__init__(self)
    		self.ip = ip
    		self.port = port
    		self.clientsocket = clientsocket
    		print ("Connexion entrante depuis %s sur son port %s" % (self.ip, self.port, ))
    
    	# Réponse du serveur
    	def run(self): 
    
    		# Importation du fichier GENERAL ROKU XML
    		data_xml = open(r'/home/maint/Bureau/SCRIPTS/roku_general.xml','r').read()
    		
    		# Création du Header
    		HEADERS = { 'Server': 'Roku UPnP/1.0 Roku/9.1.0',\
    			    'Cache-Control': 'no-cache',\
    			    'Content-Type': 'text/xml; charset="utf-8"'
    			  }
    			
    		# Envoi de la réponse
    		response = requests.post('http://192.168.8.108:8060/', data = data_xml, headers = HEADERS)
    		print response.text
    
    		# Déconnexion du client
    		print ("Déconnexion du client %s..." % (self.ip))
    
    # Démarrage du programme
    if __name__ == "__main__":
    
    	# Validation des paramètres d'entrée
    	check_arguments(sys.argv[1:])
    
    	# Création d'une socket TCP IPV4
    	tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    	# Ajout de l'option SO_REUSEADDR afin de rendre immédiatement le port disponible après utilisation
    	tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
    	# On bind la socket sur l'IP et PORT demandés
    	tcpsock.bind((HOST,PORT))
    
    	# Bloucle continue
    	while True:
    
    		# Ecoute avec une file d'attente maximale de 5 connexions
    		tcpsock.listen(5)
    
    		# Accepte la connexion, en récupérant les informations de l'émetteur
    		(clientsocket, (ip, port)) = tcpsock.accept()
    
    		# Vérification du type de la requête
    		data = clientsocket.recv(1024)
    		if ("GET / HTTP/1.1" in str(data) and ("Host: " + HOST + ":" + str(PORT)) in str(data)) or ("GET /query/apps HTTP/1.1" in str(data) and ("Host: " + HOST + ":" + str(PORT)) in str(data)) :
    			# Message d'information
    			print "Requête acceptée"
    
    			# Création de l'objet thread pour gérer la connexion
    			newthread = ClientThread(ip, port, clientsocket)
    			newthread.start()

  4. #4
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    14 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 14 476
    Points : 24 494
    Points
    24 494
    Par défaut
    Salut,

    Citation Envoyé par dammex Voir le message
    En gros, je voudrais pouvoir envoyer une requête HTTP/1.1 201 OK avec du contenu XML lorsqu'une requête GET / HTTP/1.1 est reçue.
    Le serveur reçoit éventuellement une requête contenant "GET / HTTP/1.1" et y répond par "HTTP/1.1 201 OK" avec du contenu XML.
    Effectivement, "requests" c'est pour le client.
    Côté serveur, soit vous utilisez une bibliothèque standard comme SimpleHTTPServer (il y en a d'autre), soit vous utilisez un framework comme flask, soit vous codez cela au dessus de votre socket (en ayant regardé à quoi ressemble le protocole HTTP).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. List-Component avec source de données xml
    Par santana2006 dans le forum iReport
    Réponses: 0
    Dernier message: 27/08/2009, 13h53
  2. [MySQL] lecteur divx utilisant des liens http avec base de donnée
    Par elfen_lied dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/05/2008, 22h09
  3. animation flash avec donnée XML
    Par clementine dans le forum Flash
    Réponses: 11
    Dernier message: 28/07/2006, 12h47
  4. probleme d'affichage de données XML avec XSL
    Par sundjata dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 08/06/2006, 19h59
  5. Intégration des fichier XML dans une base de données MySQL
    Par bebemoundjou dans le forum XQUERY/SGBD
    Réponses: 8
    Dernier message: 25/11/2005, 23h41

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