Sockets API für Python 2


Sockets sind nur für kostenpflichtige Anwendungen verfügbar und Traffic von Sockets wird als ausgehende Bandbreite berechnet. Sockets sind außerdem durch tägliche Kontingente und Minutenkontingente (Burst) begrenzt. Async IO (wie Twisted in Python) wird nicht unterstützt. App Engine unterstützt die Standard-API für Python-Socket-Module nur für ausgehende Sockets. Sie importieren die Standard-Socket-Bibliothek einfach mit folgender Anweisung:

import socket

Bibliotheken, die socket importieren, wie poplib oder nntplib, und nicht gegen die unten aufgeführten Limits und Einschränkungen verstoßen, sollten ohne Änderungen funktionieren.

Obwohl App Engine Sockets unterstützt, müssen Sie bestimmte Einschränkungen und Verhaltensweisen beachten, wenn Sie Sockets verwenden.

Sie können einen Socket-Deskriptor einbinden und zwischen App Engine-Instanzen übergeben, beispielsweise als Teil einer Aufgabennutzlast. In diesem Szenario können Sie einen Socket auf einer Front-End-Instanz öffnen, ihn dann an eine Back-End-Instanz übergeben und dort verwenden.

In SDK-Versionen vor 1.8.1 konnten Sie keine get/set-Optionen für Sockets aufrufen. (Dadurch wurden Ausnahmen vom Typ "Nicht implementiert" ausgelöst.) Die Sockets API ermöglicht dies jedoch jetzt.

Bei unterstützten Optionen geben Aufrufe von getsockopt einen Simulationswert zurück und Aufrufe von setsockopt werden ohne Rückmeldung ignoriert. Bei nicht unterstützten Optionen werden weiterhin Fehlermeldungen zurückgegeben.

Die folgenden Optionen werden unterstützt:

  • SO_KEEPALIVE
  • SO_DEBUG
  • TCP_NODELAY
  • SO_LINGER
  • SO_OOBINLINE
  • SO_SNDBUF
  • SO_RCVBUF
  • SO_REUSEADDR

Limits und Einschränkungen

Die Socket-Unterstützung in App Engine unterliegt den folgenden Einschränkungen:

  • Sockets sind nur für kostenpflichtige Anwendungen verfügbar.
  • Sie können keinen Socket erstellen, der auf eingehende Verbindungen wartet; nur ausgehende Sockets können erstellt werden.
  • FTP wird nicht unterstützt.
  • Standardmäßig ist httplib für die Nutzung der urlfetch api konfiguriert. Wenn Sie socket verwenden müssen, um die urlfetch-Limits zu umgehen, können Sie diese Standardeinstellung ändern und für httplib stattdessen Sockets nutzen. Weitere Informationen finden Sie unter httplib für die Verwendung von Sockets konfigurieren.
  • Sie können nur TCP oder UDP verwenden. Andere Protokolle sind nicht zulässig.
  • Sie können Sockets nicht an bestimmte IP-Adressen oder Ports binden.
  • Port 25 (SMTP) ist blockiert; Sie können weiterhin authentifiziertes SMTP auf dem Übermittlungsport 587 verwenden.
  • Private, Broadcast-, Multicast- und Google IP-Bereiche (mit Ausnahme der unten aufgelisteten) sind blockiert:

    • Google Public DNS: 8.8.8.8, 8.8.4.4, 2001:4860:4860::8888, 2001:4860:4860::8844 Port 53
    • Gmail SMTP: smtp.gmail.com Port 465 und 587
    • Gmail POP3: pop.gmail.com Port 995
    • Gmail IMAP: imap.gmail.com Port 993
  • Socket-Deskriptoren sind der App Engine-Anwendung zugeordnet, mit der sie erstellt wurden, und nicht übertragbar. Sie können also nicht von anderen Anwendungen genutzt werden.

  • Sockets können nach zwei Minuten Inaktivität zurückgefordert werden. Mit jedem Socket-Vorgang ist der Socket für weitere zwei Minuten aktiv.

  • Derzeit ist socket.gethostbyaddr() nicht in Python implementiert. Sie können aber weiterhin mit der SMTP-Standardbibliothek von Python (smtplib) eine Verbindung öffnen:

    # Open a connection to my mail server
    s = smtplib.SMTP('smtp.mailhostingcompany.net', 587)
    

Sockets mit dem Entwicklungsserver verwenden

Sie können Code mithilfe von Sockets auf dem Entwicklungsserver ausführen und testen, ohne spezielle Befehlszeilenparameter zu verwenden.

Sockets mit OpenSSL verwenden

App Engine unterstützt systemeigenes Python OpenSSL für die Python 2.7-Laufzeit. Sie müssen die Datei app.yaml so konfigurieren, dass sie die SSL-Bibliothek lädt, wie unter Python SSL verwenden erläutert.

httplib für die Verwendung von Sockets konfigurieren

Wenn Sie httplib importieren, wird damit standardmäßig die urlfetch api verwendet. Damit httplib stattdessen Sockets verwendet, fügen Sie in die Datei app.yaml für Ihr Projekt einfach die entsprechende Umgebungsvariable ein:

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

Der Wert kann beliebig sein (auch ein leerer String). Wird die Variable nicht eingefügt, verwendet httplib weiterhin URLFetch.

App Engine-Beispiel mit Sockets

Ein Beispiel mit Sockets finden Sie in der Socket-Demo-Anwendung auf der GitHub-Seite der Google Cloud Platform.