Il traffico proveniente dai socket viene fatturato come larghezza di banda in uscita. L'IO asincrono (come Twisted in Python) non è supportato. App Engine supporta l'API del modulo socket Python standard solo per i socket in uscita. È sufficiente importare la libreria socket standard utilizzando la seguente istruzione:
import socket
Le librerie che importano socket
, come
poplib
o nntplib
, e che non violano le
limitazioni e restrizioni elencate di seguito
devono funzionare senza modifiche.
Sebbene il runtime Python 2 supporti i socket, devi tenere presente alcune limitazioni e comportamenti quando utilizzi i socket.
Puoi prelevare un descrittore socket e passarlo tra istanze App Engine, ad esempio parte di un payload di Tasks. In questo scenario, puoi aprire un socket su un'istanza di frontend, quindi passarlo a un'istanza di backend e utilizzarlo lì.
Nelle versioni dell'SDK precedenti alla 1.8.1, non potevi chiamare le opzioni get/set sui socket. Ciò ha sollevato le eccezioni "Non implementato".) Tuttavia, l'API Sockets ora consente questa operazione.
Per le opzioni supportate, le chiamate al numero getsockopt
restituiranno un valore fittizio e le chiamate al numero setsockopt
verranno ignorate senza alcun avviso. Gli errori continueranno a essere segnalati 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 dei socket in App Engine presenta le seguenti limitazioni:
- Non puoi creare un socket di ascolto, ma puoi solo creare socket in uscita.
- L'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 i socket. Per maggiori informazioni, consulta la sezione Utilizzare i socket inhttplib
. - Puoi utilizzare solo TCP o UDP. Non sono consentiti protocolli arbitrari.
- Non puoi eseguire l'associazione a indirizzi IP o porte specifici.
- La porta 25 (SMTP) è bloccata; puoi comunque utilizzare l' SMTP autenticato sulla porta di invio 587.
Gli intervalli IP privati, broadcast, multicast e 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
, porta 532001:4860:4860::8844
- SMTPS di Gmail:
smtp.gmail.com
porta 465 e 587 - POP3S di Gmail:
pop.gmail.com
porta 995 - IMAPS di Gmail:
imap.gmail.com
porta 993
- Google Public DNS:
I descrittori del socket sono associati all'app App Engine che li ha creati e non sono trasferibili (non possono essere utilizzati da altre app).
I socket possono essere recuperati dopo 10 minuti di inattività; qualsiasi operazione socket mantiene il socket in uso per altri 10 minuti.
Attualmente,
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 i socket sul server di sviluppo, senza utilizzare parametri speciali della riga di comando.
Utilizzo di socket con OpenSSL
App Engine supporta Python OpenSSL nativo per il runtime Python 2.7.
Devi configurare il file app.yaml
per caricare la libreria SSL, come descritto in
Supporto OpenSSL.
Disattivare il recupero URL per evitare la gestione di tutte le richieste in uscita
Se importi httplib
, per impostazione predefinita verrà utilizzata
l'API urlfetch. Per modificare questa impostazione in modo che httplib
utilizzi invece i socket, aggiungi la seguente variabile di ambiente al tuo file app.yaml
:
env_variables:
GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'
Puoi sostituire anyvalue
con qualsiasi valore, inclusa una stringa vuota.
Esempio di App Engine utilizzando socket
Per un esempio sull'utilizzo dei socket, consulta l'app demo socket nel GitHub di Google Cloud Platform.