O tráfego dos 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.
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. Você só pode criar soquetes de saída.
- O FTP não é compatível.
- Por padrão,
httplib
é configurado para usar a API urlfetch. Se você precisar usarsocket
para contornar os limites de busca de URL, altere esse padrão para quehttplib
use soquetes. Para mais informações, consulte Como fazer com quehttplib
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 de IP particulares, de transmissão, multicast e do Google são bloqueados, exceto os listados abaixo:
- 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
- DNS público do Google:
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 dez minutos de inatividade. Qualquer operação de soquete mantém o soquete ativo por mais dez minutos.
Atualmente,
socket.gethostbyaddr()
não é implementado no Python. Ainda é possível 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 desativar a busca de URL para lidar com todas as solicitações de saída
Se você importar httplib
, por padrão, ele usará a
API urlfetch. Se quiser alterar isso
para que httplib
use soquetes, adicione a seguinte variável
de ambiente ao arquivo app.yaml
:
env_variables:
GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'
É possível substituir anyvalue
por qualquer valor, incluindo uma string vazia.
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.