适用于旧版捆绑服务的 Sockets API


来自套接字的流量将作为传出带宽结算。 不支持异步 IO(例如 Python 中的 Twisted)。App Engine 仅支持出站套接字的标准 Python 套接字模块 API。您只需使用以下语句即可导入标准套接字库:

import socket

导入 socket(如 poplibnntplib)并且不违反下面列出的局限和限制的库在运行时不得有任何修改。

虽然 Python 2 运行时环境支持套接字,但在使用套接字时仍需注意某些限制和行为。

您可以将套接字描述符序列化,并在 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。 您必须按 OpenSSL 支持中所述,配置 app.yaml 文件以加载 ssl 库。

禁止 URL Fetch 处理所有出站请求

如果您导入了 httplib,则默认情况下它将使用 urlfetch api。要更改此设置以使 httplib 使用套接字,请将以下环境变量添加到 app.yaml 文件中:

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

您可以将 anyvalue 替换为任何值,包括空字符串。

使用套接字的 App Engine 示例

如需查看套接字用法示例,请参阅 Google Cloud Platform GitHub 中的套接字演示应用