Présentation de l'API Sockets Python


Les sockets ne sont disponibles que pour les applications payantes, et le trafic provenant des sockets est facturé en tant que bande passante sortante. Les sockets sont également limités par des quotas quotidiens et des quotas par minute (quotas d'utilisation intensive). Les entrées/sorties asynchrones (telles que Twisted en Python) ne sont pas acceptées. App Engine est le module standard de l'API Sockets pour Python (sockets sortants uniquement). Il vous suffit simplement d'importer la bibliothèque standard socket à l'aide de l'instruction suivante :

import socket

Les bibliothèques qui importent des modules socket, tels que poplib ou nntplib, et qui ne violent pas les limites et restrictions énumérées ci-dessous, devraient fonctionner sans modification.

Bien qu'App Engine accepte les sockets, vous devez connaître certaines des limites et certains des comportements qui s'appliquent à leur utilisation.

Vous pouvez choisir un descripteur de socket et le transmettre entre les instances App Engine, comme par exemple dans une charge utile Task. Dans ce scénario, vous pouvez ouvrir un socket sur une instance frontend, puis le transmettre à une instance principale sur laquelle vous l'utiliserez.

Dans les SDK de version antérieure à 1.8.1, il n'était pas possible d'appeler les options get/set avec les sockets. (Cela générait des exceptions "Not implemented".) Cependant, l'API Sockets vous permet désormais de le faire.

Pour les options compatibles, les appels à getsockopt renvoient une valeur fictive et les appels à setsockopt sont ignorés sans notification. Les erreurs continuent d'être générées pour les options non compatibles.

Les options compatibles sont les suivantes :

  • SO_KEEPALIVE
  • SO_DEBUG
  • TCP_NODELAY
  • SO_LINGER
  • SO_OOBINLINE
  • SO_SNDBUF
  • SO_RCVBUF
  • SO_REUSEADDR

Limites et restrictions

Dans App Engine, la compatibilité avec les sockets présente les limitations suivantes :

  • Les sockets ne sont disponibles que pour les applications payantes.
  • Vous ne pouvez pas créer de socket d'écoute et vous ne pouvez créer que des sockets sortants.
  • Le protocole FTP n'est pas pris en charge.
  • Par défaut, httplib est configuré pour utiliser l'API urlfetch. Si vous devez utiliser socket pour contourner les limites "urlfetch", vous pouvez le faire en modifiant cette valeur par défaut pour que httplib utilise des sockets à la place. Pour en savoir plus, consultez Forcer httplib à utiliser des sockets.
  • Seuls TCP ou UDP peuvent être utilisés. Les protocoles arbitraires ne sont pas autorisés.
  • Vous ne pouvez pas établir de liaisons à des adresses IP ou des ports spécifiques.
  • Le port 25 (SMTP) est bloqué. Vous pouvez utiliser le protocole SMTP authentifié sur le port de soumission 587.
  • Les plages IP privées, de diffusion, de multidiffusion et Google (à l'exception de celles énumérées ci-dessous) sont bloquées :

    • DNS publics Google : 8.8.8.8, 8.8.4.4, 2001:4860:4860::8888, 2001:4860:4860::8844 (port 53)
    • Gmail SMTPS : smtp.gmail.com (ports 465 et 587)
    • Gmail POP3S : pop.gmail.com (port 995)
    • Gmail IMAPS : imap.gmail.com (port 993)
  • Les descripteurs de socket sont associés à l'application App Engine qui les a créés et ne sont pas transférables (ils ne peuvent pas être utilisés par d'autres applications).

  • Les sockets peuvent être récupérés après 2 minutes d'inactivité. Toute opération de socket maintient le socket en vie pendant 2 minutes supplémentaires.
  • Actuellement, socket.gethostbyaddr() n'est pas mis en œuvre en Python. Vous pouvez toujours utiliser la bibliothèque Python SMTP standard (smtplib) pour ouvrir une connexion :

    # Open a connection to my mail server
    s = smtplib.SMTP('smtp.mailhostingcompany.net', 587)
    

Utiliser des sockets avec le serveur de développement

Vous pouvez exécuter et tester du code à l'aide de sockets sur le serveur de développement, sans utiliser de paramètres de ligne de commande spéciaux.

Utiliser des sockets avec OpenSSL

App Engine accepte la bibliothèque OpenSSL Python native pour l'exécution de Python 2.7. Vous devez configurer le fichier app.yaml pour charger la bibliothèque ssl, comme décrit dans Assistance OpenSSL.

Forcer httplib à utiliser des sockets

Si vous importez le module httplib, il utilisera par défaut l'API urlfetch. Pour changer ce comportement de sorte que httplib utilise plutôt des sockets, il vous suffit simplement d'ajouter la variable d'environnement au fichier app.yaml de votre projet.

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

La valeur peut être exprimée sous n'importe quelle forme, y compris une chaîne vide. Si la variable n'est pas spécifiée, httplib continuera d'utiliser "URLFetch".

Exemple d'utilisation de sockets sur App Engine

Pour un exemple d'utilisation de sockets, consultez l'application de démonstration de socket sur le GitHub de Google Cloud Platform.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Environnement standard App Engine pour Python