Sockets API für gebündelte Legacy-Dienste


Traffic von Sockets wird als ausgehende Bandbreite abgerechnet. 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 wie poplib oder nntplib importieren und nicht gegen die unten aufgeführten Limits und Einschränkungen verstoßen, sollten ohne Änderungen funktionieren.

Obwohl die Python 2-Laufzeitumgebung Sockets unterstützt, gibt es einige Einschränkungen und Verhaltensweisen, die Sie bei der Verwendung von Sockets beachten sollten.

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 Frontend-Instanz öffnen, ihn dann an eine Backend-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:

  • 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 SMTPS: smtp.gmail.com Port 465 und 587
    • Gmail POP3S: pop.gmail.com Port 995
    • Gmail IMAPS: 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 zehn Minuten Inaktivität zurückgewonnen werden. Jeder Socket-Vorgang hält den Socket für weitere zehn 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 Ihre app.yaml-Datei so konfigurieren, dass die SSL-Bibliothek geladen wird, wie unter OpenSSL-Unterstützung beschrieben.

URL-Abruf für die Verarbeitung aller ausgehenden Anfragen deaktivieren

Wenn Sie httplib importieren, wird damit standardmäßig die urlfetch api verwendet. Wenn httplib stattdessen Sockets verwenden soll, fügen Sie der Datei app.yaml die folgende Umgebungsvariable hinzu:

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

Sie können anyvalue durch einen beliebigen Wert einschließlich eines leeren Strings ersetzen.

App Engine-Beispiel mit Sockets

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