Il traffico dai socket viene fatturato come larghezza di banda in uscita. L'I/O asincrono (ad esempio Twisted in Python) non è supportato. App Engine supporta l'API del modulo socket Python standard solo per i socket in uscita. Ti basta importare la libreria socket standard utilizzando la seguente istruzione:
import socket
Le librerie che importano socket, ad esempio
poplib o nntplib, e che non violano le
limitazioni e restrizioni elencate
di seguito, dovrebbero funzionare senza modifiche.
Sebbene il runtime Python 2 supporti i socket, esistono alcune limitazioni e comportamenti di cui devi essere a conoscenza quando utilizzi i socket.
Puoi serializzare 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 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 era possibile chiamare le opzioni get/set per i socket. In questo modo sono state generate eccezioni "Not Implemented" (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 automaticamente. Gli errori continueranno a essere
generati per le opzioni non supportate.
Le opzioni supportate sono:
SO_KEEPALIVESO_DEBUGTCP_NODELAYSO_LINGERSO_OOBINLINESO_SNDBUFSO_RCVBUFSO_REUSEADDR
Limitazioni e restrizioni
Il supporto dei socket in App Engine presenta le seguenti limitazioni:
- Non puoi creare un socket di ascolto, ma solo socket in uscita.
- FTP non è supportato.
- Per impostazione predefinita,
httplibè configurato per utilizzare l'API urlfetch. Se devi utilizzaresocketper aggirare i limiti di urlfetch, puoi farlo modificando questa impostazione predefinita in modo chehttplibutilizzi i socket. Per saperne di più, consulta la sezione Utilizzare i socket inhttplib. - Puoi utilizzare solo TCP o UDP; i protocolli arbitrari non sono consentiti.
- Non puoi eseguire il binding a porte o indirizzi IP specifici.
- La porta 25 (SMTP) è bloccata. Puoi comunque utilizzare SMTP autenticato sulla porta di invio 587.
Gli intervalli IP privati, di trasmissione, 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, porta2001:4860:4860::8844 - SMTPS di Gmail: porte 465 e 587
smtp.gmail.com - Gmail POP3S:
pop.gmail.comporta 995 - Gmail IMAPS:
imap.gmail.comporta 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).
I socket possono essere recuperati dopo 10 minuti di inattività; qualsiasi operazione relativa a un socket lo mantiene attivo 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 i socket sul server di sviluppo, senza utilizzare parametri speciali della riga di comando.
Utilizzo dei socket con OpenSSL
App Engine supporta OpenSSL Python nativo per il runtime Python 2.7.
Devi configurare il file app.yaml per caricare la libreria SSL, come descritto in
Supporto di OpenSSL.
Disattivazione del recupero URL dalla 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 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 i socket, consulta l'app demo socket in GitHub di Google Cloud Platform.