【问题标题】:XMPP: can multiple users connect to a server over the same TCP connection?XMPP:多个用户可以通过同一个 TCP 连接连接到服务器吗?
【发布时间】:2014-02-01 12:31:14
【问题描述】:

我的客户通过自定义协议与我的服务器通信。现在我正在添加由 XMPP 服务器 (ejabberd) 支持的聊天系统。我的服务器将通过代表其所有客户端登录 XMPP 服务器将用户消息传送到 XMPP 服务器。

由于单个服务器可以有多个客户端,因此从我的服务器到 XMPP 服务器的单个 TCP 连接会很好。这可能吗?如果是,该怎么做?我还不熟悉XMPP。

似乎 XML 流在开始时打开并在结束时关闭,并且结束标记没有任何指示要关闭哪个流。所以我假设我不能在同一个 TCP 连接上拥有多个 XML 流。请更正。

我可以尝试使用不同的用户名多次登录,并在允许的任何地方指定“来自”。我注意到在很多地方“from”属性是可选的,ejabberd 可以假设它可能基于连接,所以我担心这是否可能。

【问题讨论】:

    标签: xmpp ejabberd


    【解决方案1】:

    对于正常的客户端到服务器连接,每个客户端都必须使用单独的连接。客户端通常不会在 XML 流的开始标记的from 属性中发送其 JID,而是在 SASL 身份验证期间标识自己。

    ejabberd 支持XEP-0114 中描述的协议,因此您的系统可以作为“组件”连接到 ejabberd,并代表许多不同的用户发送和接收消息。根据您想做的事情,您可能需要重新实现 ejabberd 开箱即用的许多功能,例如在线订阅、名册管理、系统中用户之间的消息路由。在这种情况下,ejabberd 为您做的唯一 事情是将所有邮件发送给特定域中的收件人,并路由您发送的任何出站邮件。

    【讨论】:

    • 据我了解,组件是其主机名(域)中所有用户的代理,服务器重定向“to”包含该主机名的所有数据包。我的用户在我的服务器之间迁移。在这种情况下,ejabberd 组件不适合我的需求,对吗?
    【解决方案2】:

    legoscia 为您提供了一些有关如何使您的服务器使用单个 TCP 连接的信息。请允许我提出一些您想要单独的 TCP 连接的原因。

    首先,TCP 连接并不昂贵。有时它们太重(并且您使用 UDP),但这不是一个。 XMPP 身份验证 比 TCP 设置/拆除更昂贵。

    在其他系统资源上也不算太贵。在正常的 XMPP 对话中,客户端连接到服务器上的侦听器端口,服务器使用自己的端口启动一个工作进程,然后两者进行对话。客户端和服务器都使用系统分配的端口号,因此如果您的所有客户端连接都来自一台机器,您可以拥有大约 65,000 个与服务器的连接。在您用完要使用的端口之前,您将用完其他资源(CPU、网络带宽等)。

    其次,每个会话一个 TCP 连接是一种方便的映射。 Ejabberd 使用每个连接一个进程的习惯用法来隔离客户端。如果您将所有客户端都放在一个 TCP 会话中,那么将它们拆分为单独的进程会很痛苦。如果它们都在一个进程中,那么您就不会获得客户端之间的并发性或进程安全性。

    最后,当调试网络问题时,Wireshark 可以解析 TCP 会话并使其易于阅读。如果您的所有客户都在一次对话中,那么您不会获得任何好处。

    【讨论】:

      猜你喜欢
      • 2019-03-15
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      相关资源
      最近更新 更多