配置真正承载 XMPP 流的连接。在无关的 URLConnection 上设置代理并不会把 Smack 的 TCP 连接重定向到消息服务。

Smack 4.4 为 HTTP、SOCKS4 和 SOCKS5 提供了 ProxyInfo 工厂。将得到的对象附加到 XMPP 连接构建器:

import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.proxy.ProxyInfo;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;

ProxyInfo proxy = ProxyInfo.forSocks5Proxy(
    "proxy.example.net", 1080, proxyUser, proxyPassword
);

XMPPTCPConnectionConfiguration config =
    XMPPTCPConnectionConfiguration.builder()
        .setXmppDomain("chat.example.net")
        .setHost("xmpp-node.example.net")
        .setPort(5222)
        .setProxyInfo(proxy)
        .setSecurityMode(
            ConnectionConfiguration.SecurityMode.required
        )
        .build();

这是针对现有 Smack 4.4 配置的配置片段。外围应用负责处理构建器的受检异常并提供代理凭据。显式指定的主机和端口代表 XMPP 服务实际的 TCP 端点。

这里有三个名称,角色各不相同:

  • proxy.example.net 是接收初始连接的中间层。
  • xmpp-node.example.net 是要求代理访问的服务器端点。
  • chat.example.net 是 XMPP 服务域,例如账户 JID 中 @ 之后的域。

服务可以为后两者使用同一个名称,但代理主机名不会取代其中任何一个。请在连接及其 TLS 验证中保留预期的 XMPP 服务身份。

对于 HTTP 代理,请使用 ProxyInfo.forHttpProxy 并配上合适的代理端口和凭据。该路径需要能够隧道传输 XMPP 连接并允许其目标端口的代理。处理 HTTPS 网页浏览的代理并不会自动允许到 5222 端口上 XMPP 服务的 TCP 连接。

片段中必需的安全模式使 TLS 成为 XMPP 连接的条件。它不执行代理认证,代理凭据也不会登录 XMPP 账户。在建立路由和安全会话之后,通过 Smack 的常规认证流程配置 XMPP 账户。

让示例保持在其 API 世代内。较早的基于构造器的 ConnectionConfiguration 示例表达了相同的路由概念,但此处使用的是 Smack 4.4 的构建器接口。无需复现已过时消息服务提供商的主机名,就能将该概念应用于当前的 XMPP 服务。

相关文章