XMPP:多个用户可以通过同一个TCP连接连接到服务器吗?

时间:2014-01-13 16:48:45

标签: xmpp ejabberd

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

首先,TCP连接并不是非常昂贵。有些时候它们太重了(你使用UDP),但这不是一个。 XMPP身份验证比TCP setup / teardown更昂贵。

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

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

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