API de Sockets para servicios agrupados en paquetes heredados


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 usar socket a fin de evitar los límites de URLFetch, puedes cambiar este valor predeterminado para que httplib use sockets en su lugar. Para obtener más información, consulta Haz que httplib 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.88.8.4.42001: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
  • 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.