Le trafic provenant des sockets est facturé en tant que bande passante sortante. 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 de sockets standard à l'aide de l'instruction suivante :
import socket
Les bibliothèques qui importent des modules socket
, tels que poplib
ou nntplib
, et qui n'enfreignent pas les limites et les restrictions énumérées ci-dessous, devraient fonctionner sans modification.
Bien que l'environnement d'exécution Python 2 soit compatible avec les sockets, vous devez connaître certaines limitations et certains comportements lorsque vous utilisez des sockets.
Vous pouvez choisir un descripteur de socket et le transmettre entre les instances App Engine, par exemple dans les données utiles d'une tâche. 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 acceptées 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 :
- 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 compatible.
- Par défaut,
httplib
est configuré pour utiliser l'API UrlFetch. Si vous devez utilisersocket
pour contourner les limites d'UrlFetch, vous pouvez le faire en modifiant cette valeur par défaut pour quehttplib
utilise des sockets à la place. Pour en savoir plus, reportez-vous à la section Forcerhttplib
à 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 public de 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)
- DNS public de Google :
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 10 minutes d'inactivité. Toute opération de socket maintient le socket en vie pendant 10 minutes supplémentaires.
La fonction
socket.gethostbyaddr()
n'est actuellement pas mise 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'environnement d'exécution Python 2.7.
Vous devez configurer le fichier app.yaml
pour charger la bibliothèque SSL, comme décrit dans la page Utilisation de SSL Python.
Désactiver la gestion de toutes les requêtes sortantes par UrlFetch
Si vous importez le module httplib
, il utilisera par défaut l'API UrlFetch. Pour modifier ce paramètre afin que httplib
utilise plutôt des sockets, ajoutez la variable d'environnement suivante à votre fichier app.yaml
:
env_variables:
GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'
Vous pouvez remplacer anyvalue
par n'importe quelle valeur, y compris une chaîne vide.
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.