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 Siesocket
verwenden müssen, um die urlfetch-Limits zu umgehen, können Sie diese Standardeinstellung ändern und fürhttplib
stattdessen Sockets nutzen. Weitere Informationen finden Sie unterhttplib
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
- Google Public DNS:
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.