O Python 2 não é mais compatível com a comunidade. Recomendamos que você migre aplicativos do Python 2 para o Python 3.

Visão geral da API Sockets para Python 2


O tráfego de soquetes é faturado como largura de banda de saída. Async IO (como Twisted no Python) não é compatível. O App Engine aceita a API do módulo de soquete do Python padrão apenas para soquetes de saída. Basta importar a biblioteca de soquetes padrão usando a seguinte instrução:

import socket

Bibliotecas que importam socket, como poplib ou nntplib, e que não violam as limitações e restrições listadas abaixo, devem funcionar sem modificações.

Embora o ambiente de execução do Python 2 seja compatível com soquetes, há algumas limitações e comportamentos que você precisa conhecer ao usar soquetes.

Separe um descritor de soquete e o passe entre instâncias do App Engine, como parte de um payload Task. Neste cenário, abra um soquete em uma instância de front-end, passe-o para uma instância de back-end e o use aí.

Em versões do SDK anteriores a 1.8.1, você não podia chamar opções get/set em relação a soquetes. Isso gerou exceções "Não implementado". No entanto, a API Sockets já permite isso.

Para as opções compatíveis, as chamadas para getsockopt retornarão um valor de simulação e as chamadas para setsockopt serão silenciosamente ignoradas. Os erros continuarão sendo gerados para opções não compatíveis. As opções compatíveis são estas:

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

Limitações e restrições

A compatibilidade de soquetes com o App Engine tem as seguintes limitações:

  • Não é possível criar um soquete de escuta. Só é possível criar soquetes de saída.
  • O FTP não é compatível.
  • Por padrão, httplib é configurado para usar a API urlfetch. Se você precisar usar socket para contornar os limites de busca de URL, altere esse padrão para que httplib use soquetes. Para mais informações, consulte Como fazer com que httplib use soquetes.
  • Só é possível usar TCP ou UDP. Não são permitidos protocolos arbitrários.
  • Não é possível se vincular a portas ou endereços IP específicos.
  • A porta 25 (SMTP) está bloqueada. Ainda é possível usar SMTP autenticado na porta de envio 587.
  • Os intervalos particulares, de transmissão, multicast e de IPs do Google, exceto os colocados na lista de permissões, estão bloqueados:

    • DNS público do Google: 8.8.8.8, 8.8.4.4, 2001:4860:4860::8888, 2001:4860:4860::8844 porta 53
    • SMTPS do Gmail: smtp.gmail.com portas 465 e 587
    • POP3S do Gmail: pop.gmail.com porta 995
    • IMAPS do Gmail: imap.gmail.com porta 993
  • Os descritores de soquete estão associados ao app do App Engine que os criou e não são transferíveis, ou seja, não podem ser usados por outros aplicativos.

  • Os soquetes poderão ser recuperados depois de dois minutos de inatividade. Qualquer operação de soquete mantém o soquete ativo por mais dois minutos.

  • Atualmente, socket.gethostbyaddr() não é implementado no Python. Você ainda pode usar a biblioteca padrão SMTP do Python (smtplib) para abrir uma conexão:

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

Como usar soquetes com o servidor de desenvolvimento

É possível executar e testar código usando soquetes no servidor de desenvolvimento, sem empregar parâmetros de linha de comando especiais.

Como usar soquetes com OpenSSL

O App Engine aceita o OpenSSL nativo do Python no tempo de execução do Python 2.7. Configure o arquivo app.yaml para carregar a biblioteca ssl, conforme descrito no Suporte do OpenSSL.

Como fazer httplib usar soquetes

Se você importar httplib, por padrão, ele usará a API urlfetch. Para alterar isso para que httplib use soquetes, basta adicionar a variável de ambiente ao arquivo app.yaml do projeto.

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

O valor pode ser qualquer valor (inclusive uma string vazia). Se a variável não for fornecida, httplib continuará usando URLFetch.

Amostra do App Engine que usa soquetes

Para uma amostra que usa soquetes, consulte o app de demonstração do soquete (em inglês) no GitHub do Google Cloud Platform.