Il traffico proveniente dalle socket viene fatturato come larghezza di banda in uscita. L'I/O asincrona (ad esempio Twisted in Python) non è supportata. App Engine supporta l'API del modulo socket Python standard solo per le socket in uscita. Basta importare la libreria di socket standard utilizzando la seguente dichiarazione:
import socket
Le librerie che importano socket
, ad esempio
poplib
o nntplib
, e che non violano le
limitazioni e le restrizioni elencate
di seguito, dovrebbero funzionare senza modifiche.
Sebbene il runtime di Python 2 supporti le socket, esistono determinate limitazioni e comportamenti che devi conoscere quando le utilizzi.
Puoi eseguire il pickling di un descrittore di socket e passarlo tra le istanze App Engine, ad esempio come parte del payload di un'attività. In questo scenario, puoi aprire una socket su un'istanza frontend, poi passarla a un'istanza di backend e utilizzarla lì.
Nelle versioni dell'SDK precedenti alla 1.8.1, non potevi chiamare le opzioni get/set per le socket. Questa operazione ha generato eccezioni "Non implementato". Tuttavia, l'API Sockets ora lo consente.
Per le opzioni supportate,
le chiamate a getsockopt
restituiranno un valore simulato e
le chiamate a setsockopt
verranno ignorate silenziosamente. Gli errori continueranno a essere rilevati per le opzioni non supportate.
Le opzioni supportate sono:
SO_KEEPALIVE
SO_DEBUG
TCP_NODELAY
SO_LINGER
SO_OOBINLINE
SO_SNDBUF
SO_RCVBUF
SO_REUSEADDR
Limitazioni e restrizioni
Il supporto delle socket in App Engine presenta le seguenti limitazioni:
- Non puoi creare una socket di ascolto; puoi creare solo socket in uscita.
- FTP non è supportato.
- Per impostazione predefinita,
httplib
è configurato per utilizzare l'API urlfetch. Se devi utilizzaresocket
per aggirare i limiti di urlfetch, puoi farlo modificando questa impostazione predefinita in modo chehttplib
utilizzi invece le socket. Per ulteriori informazioni, consulta la sezione Far usare le prese ahttplib
. - Puoi utilizzare solo TCP o UDP; i protocolli arbitrari non sono consentiti.
- Non puoi eseguire il binding ad indirizzi IP o porte specifici.
- La porta 25 (SMTP) è bloccata, ma puoi comunque utilizzare SMTP autenticato sulla porta di invio 587.
Gli intervalli IP privati, di trasmissione, multicast e di Google sono bloccati, ad eccezione di quelli elencati di seguito:
- Google Public DNS:
8.8.8.8
,8.8.4.4
,2001:4860:4860::8888
,2001:4860:4860::8844
porta 53 - SMTPS di Gmail:
smtp.gmail.com
porta 465 e 587 - Gmail POP3S:
pop.gmail.com
porta 995 - IMAPS di Gmail:
imap.gmail.com
porta 993
- Google Public DNS:
I descrittori di socket sono associati all'app App Engine che li ha creati e non sono trasferibili (non possono essere utilizzati da altre app).
Le socket possono essere recuperate dopo 10 minuti di inattività; qualsiasi operazione sulla socket mantiene la socket attiva per altri 10 minuti.
Al momento,
socket.gethostbyaddr()
non è implementato in Python. Puoi comunque utilizzare la libreria standard SMTP di Python (smtplib
) per aprire una connessione:# Open a connection to my mail server s = smtplib.SMTP('smtp.mailhostingcompany.net', 587)
Utilizzo dei socket con il server di sviluppo
Puoi eseguire e testare il codice utilizzando le socket sul server di sviluppo, senza utilizzare parametri della riga di comando speciali.
Utilizzo dei socket con OpenSSL
App Engine supporta OpenSSL Python nativo per il runtime Python 2.7.
Devi configurare il file app.yaml
in modo che carichi la libreria SSL, come descritto nell'assistenza OpenSSL.
Disattivare il recupero dell'URL per la gestione di tutte le richieste in uscita
Se importi httplib
, per impostazione predefinita verrà utilizzata l'API urlfetch. Per modificare questo valore in modo che httplib
utilizzi i socket, aggiungi la seguente variabile di ambiente al file app.yaml
:
env_variables:
GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'
Puoi sostituire anyvalue
con qualsiasi valore, inclusa una stringa vuota.
Esempio di App Engine che utilizza i socket
Per un esempio che utilizza le socket, consulta l'app demo per socket nel repository GitHub della piattaforma Google Cloud.