API Sockets per servizi legacy in bundle


Il traffico dai socket viene fatturato come larghezza di banda in uscita. L'IO asincrono (ad esempio Twisted in Python) non è supportato. App Engine supporta l'API del modulo socket Python standard solo per i socket in uscita. Devi semplicemente 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 le limitazioni elencate di seguito, dovrebbero funzionare senza modifiche.

Sebbene il runtime Python 2 supporti i socket, esistono alcuni limiti e comportamenti di cui devi essere a conoscenza quando utilizzi i socket.

Puoi selezionare un descrittore socket e passarlo tra le istanze di App Engine, ad esempio come parte di un payload dell'attività. In questo scenario, puoi aprire un socket su un'istanza di frontend, quindi trasmetterlo a un'istanza di backend e utilizzarla lì.

Nelle versioni dell'SDK precedenti alla 1.8.1, non potevi chiamare le opzioni get/set nei socket. In questo modo, le eccezioni sono aumentate e non implementate. Tuttavia, l'API Sockets ora consente questa operazione.

Per le opzioni supportate, le chiamate a getsockopt restituiranno un valore fittizio e le chiamate a setsockopt saranno ignorate. 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 socket in App Engine presenta le seguenti limitazioni:

  • Non puoi creare un socket di ascolto; puoi solo creare socket in uscita.
  • L'FTP non è supportato.
  • Per impostazione predefinita, httplib è configurato in modo da utilizzare l'API urlfetch; se devi utilizzare socket per aggirare i limiti urlfetch, puoi modificare questa impostazione predefinita in modo che httplib utilizzi i socket. Per ulteriori informazioni, consulta la documentazione su come utilizzare httplib socket.
  • Puoi utilizzare solo protocolli TCP o UDP. Non sono consentiti protocolli arbitrari.
  • Non è possibile associare a porte o indirizzi IP specifici.
  • La porta 25 (SMTP) è bloccata. Puoi comunque utilizzare il protocollo SMTP autenticato sulla porta di invio 587.
  • Gli intervalli di IP privati, di trasmissione, multicast e Google vengono 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
    • SMTP Gmail: porta 465 e 587 di smtp.gmail.com
    • POP3S di Gmail: porta 995 di pop.gmail.com
    • IMAPS per Gmail: porta 993 di imap.gmail.com
  • I descrittori socket sono associati all'app App Engine che li ha creati e non sono cedibili (non possono essere utilizzati da altre app).

  • I socket possono essere recuperati dopo 10 minuti di inattività. Qualsiasi operazione del socket mantiene il socket in funzione 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 usando i socket sul server di sviluppo, senza usare parametri di riga di comando speciali.

Utilizzo dei socket con OpenSSL

App Engine supporta OpenSSL nativo per Python 2.7. Devi configurare il tuo file app.yaml in modo da caricare la libreria SSL, come descritto in Supporto OpenSSL.

Disabilitazione 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 invece 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.

Campione di App Engine mediante socket

Per un esempio che utilizza i socket, consulta l'app demo socket nel GitHub di Google Cloud Platform.