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

XMPP:多个用户可以通过相同的TCP连接连接到服务器吗?,xmpp,ejabberd,Xmpp,Ejabberd,我的客户机通过自定义协议与我的服务器通信。现在我添加了由XMPP服务器(ejabberd)支持的聊天系统。我的服务器将通过代表其所有客户端登录XMPP服务器,将用户消息隧道传输到XMPP服务器 因为一台服务器可以有多个客户端,所以从我的服务器到XMPP服务器之间可以有一个TCP连接。这可能吗?如果是,怎么做?我还不熟悉XMPP 似乎XML流在开始时打开,在结束时关闭,而关闭标记没有任何指示要关闭哪个流。因此,我假设在同一个TCP连接上不能有多个XML流。请更正 我可以尝试使用不同的用户名多次登录

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

因为一台服务器可以有多个客户端,所以从我的服务器到XMPP服务器之间可以有一个TCP连接。这可能吗?如果是,怎么做?我还不熟悉XMPP

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


我可以尝试使用不同的用户名多次登录,并在任何允许的地方指定“from”。我注意到,在许多地方,“from”属性是可选的,ejabberd可能会假定它是基于连接的,所以我担心这是否可能。对于正常的客户端到服务器连接,每个客户端都必须使用单独的连接。客户端通常不会在XML流的开始标记的
from
属性中发送JID,而是在SASL身份验证期间标识自己


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

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


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

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

首先,TCP连接并不十分昂贵。有时它们太重(并且您使用UDP),但这不是一次。XMPP身份验证比TCP设置/拆卸要昂贵得多

它在其他系统资源中也不太昂贵。在正常的XMPP对话中,客户机连接到服务器上的侦听器端口,服务器使用自己的端口派生出一个工作进程,两个进程进行对话。客户端和服务器都使用系统分配的端口号,因此,如果所有客户端连接都来自一台机器,则可以有大约65000个到服务器的连接。在端口用完之前,其他资源(CPU、网络带宽等)早就用完了

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


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

Legossia向您介绍了如何使服务器使用单个TCP连接的一些信息。请允许我提出一些您希望使用独立TCP连接的原因

首先,TCP连接并不十分昂贵。有时它们太重(并且您使用UDP),但这不是一次。XMPP身份验证比TCP设置/拆卸要昂贵得多

它在其他系统资源中也不太昂贵。在正常的XMPP对话中,客户机连接到服务器上的侦听器端口,服务器使用自己的端口派生出一个工作进程,两个进程进行对话。客户端和服务器都使用系统分配的端口号,因此,如果所有客户端连接都来自一台机器,则可以有大约65000个到服务器的连接。在端口用完之前,其他资源(CPU、网络带宽等)早就用完了

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


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

据我所知,组件是其主机名(域)中所有用户的代理,服务器会重定向所有包含该主机名的数据包。我的用户在我的服务器之间迁移。在这种情况下ejabberd组件不适合我的需要,这是对的吗?据我所知,组件是其主机名(域)中所有用户的代理,服务器重定向“to”包含的所有数据包