來自通訊端的流量會依連出頻寬計費。 Async IO (例如 Python 中的 Twisted) 不受支援。App Engine 僅支援傳出通訊端的標準 Python 通訊端模組 API。您可以使用下列陳述式直接匯入標準通訊端程式庫:
import socket
匯入 socket
的程式庫 (例如 poplib
或 nntplib
) 如果並未違反以下所列的限制和規定,則應可直接運作,無需進行修改。
雖然 Python 2 執行階段支援 Socket,但使用 Socket 時,您必須留意特定限制和行為。
您可以保留通訊端描述元並在 App Engine 執行個體之間傳送,例如部分的工作酬載。在此情況下,您可以在前端執行個體上開啟通訊端,然後將其傳送給後端執行個體使用。
在 1.8.1 以前版本的 SDK 中,您無法對通訊端呼叫 get/set 選項。(此操作會引發「未實作」的例外狀況。) 不過,Sockets API 現已允許此操作。
對於支援的選項,對 getsockopt
的呼叫會傳回模擬值,而對 setsockopt
的呼叫會遭到靜默忽略。如果是不支援的選項,會持續產生錯誤。支援的選項如下:
SO_KEEPALIVE
SO_DEBUG
TCP_NODELAY
SO_LINGER
SO_OOBINLINE
SO_SNDBUF
SO_RCVBUF
SO_REUSEADDR
限制和規定
App Engine 的通訊端支援具有下列限制:
- 您無法建立監聽通訊端,只能建立傳出通訊端。
- 不支援 FTP。
- 根據預設,
httplib
設為使用 urlfetch api;如需使用socket
來規避 urlfetch 的限制,您可以變更這項預設設定,讓httplib
改為使用通訊端。詳情請參閱「讓httplib
使用通訊端」一文。 - 您只能使用 TCP 或 UDP,不能使用任意通訊協定。
- 您無法繫結至特定 IP 位址或通訊埠。
- 通訊埠 25 (SMTP) 封鎖不能使用,但您仍可於提交通訊埠 587 使用已驗證的 SMTP。
私人、廣播、多點傳送和 Google IP 範圍皆封鎖不能使用,但下列這些已加入許可清單的項目除外:
- Google 公用 DNS:
8.8.8.8
、8.8.4.4
、2001:4860:4860::8888
、2001:4860:4860::8844
通訊埠 53 - Gmail SMTPS:
smtp.gmail.com
通訊埠 465 和 587 - Gmail POP3S:
pop.gmail.com
通訊埠 995 - Gmail IMAPS:
imap.gmail.com
通訊埠 993
- Google 公用 DNS:
通訊端描述元與建立該描述元的 App Engine 應用程式相關,且無法轉移 (無法由其他應用程式使用)。
系統可在通訊端閒置 10 分鐘後將其收回,但如有任何通訊端相關作業,通訊端有效時間會延長 10 分鐘。
目前 Python 並未實作
socket.gethostbyaddr()
。您仍可使用 Python SMTP 標準程式庫 (smtplib
) 開啟連線:# Open a connection to my mail server s = smtplib.SMTP('smtp.mailhostingcompany.net', 587)
透過開發伺服器使用通訊端
您可以在開發伺服器使用通訊端執行及測試程式碼,不必使用任何特殊指令列參數。
透過 OpenSSL 使用通訊端
App Engine 支援 Python 2.7 執行階段使用原生 Python OpenSSL。您必須將 app.yaml
檔案設定為載入 SSL 程式庫,如 OpenSSL 支援文件中所述。
停用網址擷取功能,以便處理所有傳出要求
如果您匯入 httplib
,根據預設會使用 urlfetch api。如要將 httplib
改為使用通訊端,請在 app.yaml
檔案中新增下列環境變數:
env_variables:
GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'
您可以將 anyvalue
替換為任何值,包括空白字串。
使用通訊端的 App Engine 範例
如需使用通訊端的範例,請參閱 Google Cloud Platform GitHub 中的通訊端示範應用程式。