El tráfico de los sockets se factura como el ancho de banda saliente. No se admite el IO asíncrono (como Twisted en Python). App Engine es compatible con la API del módulo de socket estándar de Python para sockets de ida únicamente. Solo debes importar la biblioteca de sockets estándar con la siguiente declaración:
import socket
Las bibliotecas que importan socket
, como poplib
o nntplib
, y que cumplen las limitaciones y las restricciones que se mencionan a continuación, deberían funcionar sin modificaciones.
Aunque un entorno de ejecución de Python 2 admite sockets, hay una serie de limitaciones y comportamientos que hay que tener en cuenta cuando se usan sockets.
Puedes seleccionar un descriptor de socket y pasarlo entre las instancias de App Engine, como parte de una carga útil de Tareas. En esta situación, puedes abrir un socket en una instancia de frontend, y luego pasarlo a una instancia de backend para usarlo allí.
En las versiones de SDK anteriores a 1.8.1, no podías llamar las opciones de get/set para los sockets. (Si lo hacías, se generaba la excepción "No implementado"). No obstante, la API de Sockets ahora permite esto.
En las opciones compatibles, las llamadas a getsockopt
mostrarán un valor simulado y las llamadas a setsockopt
se ignorarán de manera silenciosa. Se continuarán generando errores para las opciones no admitidas.
Las opciones compatibles son las siguientes:
SO_KEEPALIVE
SO_DEBUG
TCP_NODELAY
SO_LINGER
SO_OOBINLINE
SO_SNDBUF
SO_RCVBUF
SO_REUSEADDR
Limitaciones y restricciones
La compatibilidad de los sockets en App Engine tiene las siguientes limitaciones:
- No puedes crear un socket de escucha; solo puedes crear sockets de salida.
- No se admite FTP.
- De forma predeterminada,
httplib
se configura con el objetivo de usar la API de URLFetch. Si necesitas usarsocket
a fin de evitar los límites de URLFetch, puedes cambiar este valor predeterminado para quehttplib
use sockets en su lugar. Para obtener más información, consulta Haz quehttplib
use sockets. - Solo puedes usar TCP o UDP; no se permiten protocolos arbitrarios.
- No puedes establecer una vinculación con puertos o direcciones IP específicos.
- El puerto 25 (SMTP) está bloqueado; pero aún puedes usar el SMTP autenticado en el puerto de envío 587.
Los rangos de IP privados, de transmisión, de multidifusión y de Google están bloqueados, excepto los que se indican a continuación:
- DNS público de Google:
8.8.8.8
,8.8.4.4
,2001:4860:4860::8888
,2001:4860:4860::8844
puerto 53 - SMTP de Gmail:
smtp.gmail.com
, puertos 465 y 587 - POP3 de Gmail:
pop.gmail.com
puerto 995 - IMAP de Gmail:
imap.gmail.com
puerto 993
- DNS público de Google:
Los descriptores de socket están asociados con la aplicación de App Engine que los creó y no se pueden transferir (no pueden usarse en otras apps).
Los sockets pueden recuperarse después de 2 minutos de inactividad; cualquier operación de socket lo mantiene en funcionamiento durante otros 10 minutos.
En este momento,
socket.gethostbyaddr()
no está implementado en Python. Aún puedes usar la biblioteca estándar de SMTP de Python (smtplib
) para abrir una conexión:# Open a connection to my mail server s = smtplib.SMTP('smtp.mailhostingcompany.net', 587)
Usa sockets con el servidor de desarrollo
Puedes ejecutar y probar el código con sockets en el servidor de desarrollo, sin usar ningún parámetro de línea de comandos especial.
Usa sockets con OpenSSL
App Engine es compatible con OpenSSL nativo de Python para el entorno de ejecución de Python 2.7.
Debes configurar tu archivo app.yaml
para cargar la biblioteca SSL, como se describe en Asistencia de OpenSSL.
Inhabilita la recuperación de URL mediante el control de todas las solicitudes salientes
Si importas httplib
, usará la API de URLFetch de forma predeterminada. Para cambiar esto a fin de que httplib
use sockets, agrega la siguiente variable de entorno a tu archivo app.yaml
:
env_variables:
GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'
Puedes reemplazar anyvalue
por cualquier valor, incluida una string vacía.
Muestra del uso de sockets de App Engine
Para obtener una muestra con sockets, consulta la app de demostración de sockets en GitHub de Google Cloud Platform.