为什么我们需要像Pusher和Socket.io这样的产品来建立websocket连接?

30

最近我在开发Laravel聊天练手项目的时候,也阅读了一些关于websockets和像Pusher、Socket.io这样的SaaS的资料。但是我不明白的是,为什么我们需要外部软件来建立websocket连接?难道像Vue.js这样的前端框架和Laravel这样的后端代码不能直接建立连接吗?为什么必须要通过像Pusher和Socket.io这样的中间人呢?对于这个问题,望多多包涵,谢谢。


4
要了解socket.io提供的一些WebSockets没有的功能列表,请参见此处:从socket.io转移到原始WebSockets?。其中许多socket.io功能非常有用,如果仅使用WebSockets,则需要自己编写它们(例如自动重新连接)。 - jfriend00
2个回答

40

它并不一定需要。

那些软件碎片只是让使用Websocket协议变得容易而已。

请记住,Laravel是一个“有偏见”的框架。这意味着它会选择自己的库来为您抽象化这些概念,以便您不必过多地担心底层发生了什么。

基本上,你需要两个组件才能够使用Websockets:

  1. 一个Websocket服务器
  2. 一个Websocket客户端

Laravel之所以不能直接使用Websockets与前端进行通信,是因为Laravel本身并不是一个Websocket服务器。至少不完全是。虽然PHP确实支持使用Websocket协议甚至有一些库可以更好地利用它, 但它并没有像其他语言那样经常用于处理长期运行的进程。

相反,Laravel使用Redis提供的发布/订阅功能来监听通过Redis和Predis库发生的事件。它这样做的原因是因为Laravel更适合作为websocket服务器和所有连接的客户端之间的中间人。
这样,Laravel既可以使用广播事件将信息传递到Websocket服务器,也可以从Websocket服务器接收事件信息并确定用户是否具有接收它们的能力或授权。
如果您不想使用Pusher,则可以使用一个专门为Laravel设计的Websocket服务器库Laravel Echo Server
在幕后,此库仍然使用Socket.io和Redis,以便在Laravel Web应用程序中所有移动部件之间无缝通信。这里的好处是您无需担心服务器发送的消息数量。

缺点是现在你必须知道如何管理和维护这个过程,以便Websocket服务器每次重启服务器时都会开启,或者如果发生故障等情况。

查看PM2,了解更多有关运行和维护服务器守护程序的信息。

如果您不同意Laravel关于如何处理Websockets的观点,那么理论上您可以使用任何其他服务器端语言来处理websocket协议。只需要更深入地了解协议本身;如果Laravel需要与其一起工作,则必须知道如何编写适当的服务和提供程序类来处理它。


但是我们如何为Android/iOS实现Laravel Echo客户端呢?我只找到了一个官方的JS库。 - user924
@user924 没有任何限制阻止您利用Android或iOS提供的任何库与Websocket服务器通信。 Laravel不提供此功能,因为它是一个Web应用程序,因此Laravel提供的任何官方客户端库都将以JavaScript编写。 如果您不知道如何在iOS或Android中使用Websockets,则可以自由发表新问题。 - maiorano84

27

简单回答?你不需要使用它们。尽管编写你自己的服务端和客户端websocket实现。

更长的回答。

为什么要使用Laravel?我可以直接使用PHP完成所有操作。

为什么要使用Vue?我可以用vanilla javascript完成所有操作。

我们使用库和框架是因为它们抽象了实现细节,使产品构建变得更容易。它们处理你没有想到或根本不知道的边缘情况,因为他们被数千或数百万开发人员使用,并且所有他们遇到并修复的知识和错误都已融入到实现中。

这是软件工程的标志之一,“代码重用”。不要重复自己,不要编写你不必编写的任何软件。它允许你专注于为你特定的要求构建解决方案,而不是在甚至在构建解决方案之前就专注于构建大量基础设施。

我从未使用过Pusher,但它看起来像一个SaaS产品。不过Socket.io是开源的


所以服务器使用Lavarel + Pusher实现了聊天,但是Lavarel的库官方只提供JS版本,没有官方的Android客户端,有些无用。 - user924

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