API Sockets per servizi in bundle legacy


Il traffico dai 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 per il traffico in uscita solo prese di corrente. Basta importare la libreria socket standard utilizzando il seguente :

import socket

Librerie che importano socket, ad esempio poplib o nntplib e che non violano le limitazioni e restrizioni elencate di seguito, dovrebbe funzionare senza modifiche.

Sebbene il runtime di Python 2 supporti le socket, ci sono alcune 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 un nel socket di un'istanza di frontend per poi 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 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 generati 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.
  • L'FTP non è supportato.
  • Per impostazione predefinita, l'app httplib è configurata in modo da utilizzare urlfetch api; se devi usa socket per aggirare i limiti di urlfetch, puoi farlo modificando questo predefinita, quindi httplib usa i socket. Per ulteriori informazioni, consulta la sezione Far usare le prese a httplib.
  • Puoi utilizzare solo TCP o UDP; i protocolli arbitrari non sono consentiti.
  • Non puoi eseguire l'associazione a indirizzi IP o porte specifici.
  • La porta 25 (SMTP) è bloccata. puoi comunque utilizzare SMTP autenticato porta di invio 587.
  • Gli intervalli IP privati, di trasmissione, multicast e di Google sono bloccati, ad eccezione di quelle elencate di seguito:

    • Google Public DNS: 8.8.8.8, 8.8.4.4, 2001:4860:4860::8888, Porta 53 2001: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
  • 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 ripristinati dopo 10 minuti di inattività. qualsiasi operazione socket mantiene in funzione la presa 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 di 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 in modo che httplib usi 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 che utilizza i socket

Per un esempio che utilizza le socket, consulta l'app demo per le socket nel repository GitHub della piattaforma Google Cloud.