O tráfego de sockets é faturado como largura de banda de saída. A E/S assíncrona (como Twisted em Python) não é suportada. O App Engine suporta a API do módulo de soquetes Python padrão apenas para soquetes de saída. Basta importar a biblioteca de sockets padrão através da seguinte declaração:
import socket
As bibliotecas que importam socket
, como poplib
ou nntplib
, e que não violam as limitações e restrições indicadas abaixo, devem funcionar sem modificações.
Embora o tempo de execução do Python 2 suporte sockets, existem determinadas limitações e comportamentos dos quais tem de estar ciente quando usa sockets.
Pode usar o módulo pickle num descritor de socket e transmiti-lo entre instâncias do App Engine, como parte de uma carga útil de tarefas. Neste cenário, pode abrir um soquete numa instância de front-end e, em seguida, passá-lo para uma instância de back-end e usá-lo aí.
Nas versões do SDK anteriores à 1.8.1, não era possível chamar opções de obtenção/definição em relação a sockets. (Ao fazê-lo, foram geradas exceções "Not Implemented".) No entanto, a API Sockets permite agora esta ação.
Para as opções suportadas, as chamadas para getsockopt
devolvem um valor simulado e as chamadas para setsockopt
são ignoradas silenciosamente. Os erros vão continuar a ser
apresentados para opções não suportadas.
As opções suportadas são:
SO_KEEPALIVE
SO_DEBUG
TCP_NODELAY
SO_LINGER
SO_OOBINLINE
SO_SNDBUF
SO_RCVBUF
SO_REUSEADDR
Limitações e restrições
O suporte de sockets no App Engine tem as seguintes limitações:
- Não pode criar um socket de escuta; só pode criar sockets de saída.
- O FTP não é suportado.
- Por predefinição, o
httplib
está configurado para usar a API urlfetch. Se precisar de usar osocket
para contornar os limites do urlfetch, pode fazê-lo alterando esta predefinição para que ohttplib
use sockets. Para mais informações, consulte o artigo Fazer com que ohttplib
use tomadas. - Só pode usar TCP ou UDP. Não são permitidos protocolos arbitrários.
- Não pode associar a endereços IP ou portas específicos.
- A porta 25 (SMTP) está bloqueada. No entanto, pode continuar a usar o SMTP autenticado na porta de envio 587.
Os intervalos de IP privados, de transmissão, de multicast e da Google estão bloqueados, exceto os indicados abaixo:
- DNS público da 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 - Gmail POP3S:
pop.gmail.com
porta 995 - IMAPS do Gmail:
imap.gmail.com
porta 993
- DNS público da Google:
Os descritores de sockets estão associados à app do App Engine que os criou e não são transferíveis (não podem ser usados por outras apps).
As portas podem ser recuperadas após 10 minutos de inatividade. Qualquer operação de porta mantém a porta ativa durante mais 10 minutos.
Atualmente, o
socket.gethostbyaddr()
não está implementado em Python. Pode continuar a usar a biblioteca padrão SMTP do Python (smtplib
) para abrir uma ligação:# Open a connection to my mail server s = smtplib.SMTP('smtp.mailhostingcompany.net', 587)
Usar sockets com o servidor de desenvolvimento
Pode executar e testar código com sockets no servidor de desenvolvimento sem usar parâmetros especiais da linha de comandos.
Usar sockets com o OpenSSL
O App Engine suporta o Python OpenSSL nativo para o tempo de execução do Python 2.7.
Tem de configurar o ficheiro app.yaml
para carregar a biblioteca SSL, conforme descrito no artigo
Suporte do OpenSSL.
Desativar a obtenção de URLs do processamento de todos os pedidos de saída
Se importar httplib
, por predefinição, usa a
API urlfetch. Para alterar esta situação
para que o httplib
use sockets, adicione a seguinte variável de ambiente
ao seu ficheiro app.yaml
:
env_variables:
GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'
Pode substituir anyvalue
por qualquer valor, incluindo uma string vazia.
Exemplo do App Engine que usa sockets
Para ver um exemplo que usa sockets, consulte a app de demonstração de sockets no GitHub da Google Cloud Platform.