舊版套裝組合服務的 Sockets API


來自通訊端的流量會依連出頻寬計費。 Async IO (例如 Python 中的 Twisted) 不受支援。App Engine 僅支援傳出通訊端的標準 Python 通訊端模組 API。您可以使用下列陳述式直接匯入標準通訊端程式庫:

import socket

匯入 socket 的程式庫 (例如 poplibnntplib) 如果並未違反以下所列的限制和規定,則應可直接運作,無需進行修改。

雖然 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.88.8.4.42001:4860:4860::88882001:4860:4860::8844 通訊埠 53
    • Gmail SMTPS:smtp.gmail.com 通訊埠 465 和 587
    • Gmail POP3S:pop.gmail.com 通訊埠 995
    • Gmail IMAPS:imap.gmail.com 通訊埠 993
  • 通訊端描述元與建立該描述元的 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 中的通訊端示範應用程式