API Sockets per servizi in bundle legacy


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 limitazioni elencate di seguito, dovrebbero funzionare senza modifiche.

Sebbene il runtime Python 2 supporti i socket, esistono alcune limitazioni e comportamenti che devi conoscere quando utilizzi i socket.

Puoi scegliere un descrittore socket e passarlo tra istanze di App Engine, ad esempio parte di un payload di 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 potevi chiamare le opzioni get/set per i socket. (in questo modo sono state sollevate eccezioni "Non implementato".) Tuttavia, l'API Sockets ora lo consente.

Per le opzioni supportate, le chiamate a getsockopt restituiranno un valore fittizio e le chiamate a setsockopt verranno ignorate in modalità silenziosa. Gli errori continueranno a essere visualizzati 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; puoi solo creare socket in uscita.
  • FTP non è supportato.
  • Per impostazione predefinita, httplib è configurato per utilizzare l'API urlfetch; se devi utilizzare socket per aggirare i limiti di recupero url, puoi farlo cambiando questo valore predefinito in modo che httplib utilizzi i socket. Per ulteriori informazioni, consulta la sezione Usare httplib per i socket.
  • Puoi utilizzare solo TCP o UDP; non sono consentiti protocolli arbitrari.
  • Non puoi eseguire l'associazione a porte o indirizzi IP specifici.
  • La porta 25 (SMTP) è bloccata; puoi comunque utilizzare SMTP autenticato sulla porta di invio 587.
  • Gli intervalli di indirizzi 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, 2001:4860:4860::8844 porta 53
    • SMTPS Gmail: smtp.gmail.com porte 465 e 587
    • POP3S di Gmail: pop.gmail.com porta 995
    • IMAPS Gmail: imap.gmail.com porta 993
  • I descrittori 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 dei socket mantiene il socket attivo per altri 10 minuti.

  • Al momento, socket.gethostbyaddr() non è implementato in Python. Puoi comunque utilizzare la libreria standard SMTP 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 della riga di comando speciali.

Utilizzo dei 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 nell'articolo sul supporto di OpenSSL.

Disattivazione della gestione di tutte le richieste in uscita dal recupero URL

Se importi httplib, per impostazione predefinita utilizzerà 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 mediante socket

Per un esempio sull'utilizzo dei socket, consulta l'app demo socket in GitHub di Google Cloud Platform.