使用XMPP或WebSocket,在用户之间进行实时通信为什么需要服务器?

4
在底层,一切都与套接字通信有关。如果有办法获取两个用户的IP地址,为什么不能直接在用户之间建立连接,而不必通过中间服务器呢?
5个回答

21

我的看法:

没有人强制我们采用基于服务器的实时通信模型。事实上,XMPP有一个称为"Serverless Messaging"的扩展,它定义了如何使用零配置网络原则进行端点发现和XML流和XMPP消息的语法进行本地或广域网通信。该方法使用基于DNS的服务发现和多播DNS来发现支持协议的实体,包括它们的IP地址和首选端口。

P2P聊天应用程序已经有十多年了。在中间放置服务器纯粹是取决于您的应用程序需求的决定。如果您的应用程序可以容忍用户在在线/离线状态之间转换时丢失聊天记录,那么您完全可以采用直接的P2P模型。同样,当选择基于服务器的消息传递模型时,存在许多优点(联系人列表管理、头像、实体发现、出席授权、离线消息等)。如果您试图在基于P2P的客户端内部完成所有这些工作,它们可能会死亡或表现不佳,因为它们需要自己执行所有这些工作。

"WebSockets"并非为P2P/无服务器通信而设计,而是旨在通过无状态HTTP协议提供标准化的PUSH语义。简而言之,“WebSockets”是一种标准化的方法,用于替代开发人员一直在使用的hacky comet、长轮询、分块编码、jsonp、基于iframe的和其他各种技术来模拟HTTP上的服务器推送。

2
非常好的回答。我想补充一点,将XMPP与WebSocket进行比较就像将汽车与道路进行比较。一旦WebSocket规范被巩固化,它将成为一个强大的工具。 - Robin
@Robin 这实际上取决于你所说的 XMPP 是指 RFC 6120 还是 RFC 6121。XMPP 核心(6120)仅定义了流协议和数据报格式——就像 WebSocket 协议一样。按照你的类比,两者都是道路。而 XMPP-IM(6121)则定义了数据报格式和含义。甚至有 RFC 7395 定义了如何通过 WebSocket 而不是 XMPP 核心“驾驶” XMPP-IM。 - smokku

3

如果有一天,命名的WebSockets(如果得到充分和广泛支持)可能是解决方案。

http://namedwebsockets.github.io/spec/

在各种协作本地设备和本地网络场景中,命名的WebSockets非常有用:发现本地设备和/或本地网络上匹配的对等服务


0
在点对点(P2P)网络中,用户之间可以直接通信。在P2P中,每个参与者都可以充当客户端和服务器。但是,在P2P网络中,您需要编写一个单独的程序来实现通信。
Web Sockets让您利用现有的常见浏览器作为客户端。一切都取决于您的应用程序的目的以及您想要如何部署它。

0

WebSockets不允许套接字监听连接,只能作为客户端连接到服务器(不能反向)。从技术上讲,它们可以使其允许此功能,但据我所知,规范目前(也不会)允许WebSocket进行监听功能。

新的WebRTC(http://www.webrtc.org/)规范似乎支持点对点连接。我还没有使用过WebRTC,因此无法发表评论。我认为这可能比WebSocket更复杂。也许了解WebRTC更多的人可以发表意见。(除了最新版本的Chrome之外,我不确定其他浏览器是否真正支持WebRTC)。


那么设备本身也可以成为服务器,不是吗? - tom
是的(据我所知),使用WebRTC,两个用户应该能够彼此连接并完全独立于任何其他方(即服务器)进行通信。但正如我所指出的,当前浏览器的支持有限。有一些演示应用程序正在使用它,包括一些使用Jingle(XMPP的P2P音频/视频扩展)的视频聊天工具。 - devlop

0
如果有一种方法可以获取两个用户的IP地址,那就太好了。
你在问题中已经给出了正确的答案。
我使用的大多数机器都有IP地址为192.168.0.10(或类似于192.168.私有网络),并且深深地隐藏在几层NAT之后。随着免费IPv4地址池的结束和IPv6仍然没有出现在视野中,这是大多数用户生活的现实。拥有一个已知的、可路由的稳定中介地址,在解决这个问题时非常有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接