草庐IT

javascript - 对于推送通知,websocket 是强制性的吗?

coder 2023-06-13 原文

我在服务器端有 PHP,在客户端有 HTML 和 javascript。

我正在制作一个应用程序,利益相关者可以在其中键入一条消息,该消息会实时广播给一组的多个接收者。

我在谷歌上做了一些研究,我知道我需要使用 WebSockets 或 Comet 来进行实时推送通知。 WebSocket 或 Comet 是否必须向用户发送大量通知?

我的理解对吗?有什么引用资料可以开始吗?

最佳答案

如果客户端是浏览器,那么标准浏览器可以连接到服务器的唯一两种方式是通过 Ajax(例如 http)请求或 webSocket 连接。因此,如果您希望客户端收到来自外界的通知,则必须使用这两种机制之一。

HTTP 请求是暂时的。 客户端向服务器发出请求,服务器响应。 HTTP 请求非常适合客户端从服务器请求信息。他们不太擅长服务器向客户端发送信息,因为通常客户端没有连接。有一些黑客和变通方法,客户端在某个时间间隔“轮询”服务器,甚至服务器可能使用运行时间更长的请求来尝试模拟“推送”类型的系统,但它们充其量只是次优的黑客。

webSockets 是连续的连接。客户端连接并且只要双方需要,连接就会保持在原位。这使得任何一方都可以随时向另一方发送消息。这意味着服务器可以随时将数据“推送”给客户端。 webSockets 对于推送连接是高效的并且被推荐(这是它们设计的主要目的之一)。

Comet 是一个库,最初是为使用 HTTP 构建的,目的是在 webSockets 发明之前以及在它们被广泛支持之前尝试“破解”或“模拟”推送。我想不出为什么人们会想要使用 Comet 而不是 webSocket,除非你有一个不支持 webSocket 的旧浏览器。

因此,如果您尝试向浏览器执行“实时服务器推送”,那么您必须有一个来自客户端的持续连接的套接字,这意味着 webSocket(或构建在 webSocket 之上的东西,如 socket.io)。

对于您有权访问手机 SDK 的手机应用程序,您可以使用操作系统内置的“推送”系统将一些消息从服务器推送到客户端。这与双向 webSocket channel 不太一样,但由于您询问了“推送通知”,Android 和 IOS 中可用的操作系统推送服务也可以作为将通知从服务器推送到客户端的选项。这是关于 iOS notifications 的信息和 Google Cloud Messaging

截至 2016 年,还可以使用 Server-sent events在除 Microsoft 浏览器(Edge 或 IE 尚不支持)之外的所有现代浏览器中,将数据从服务器推送到客户端。这是一个 browser compatibility table .服务器发送的事件使用持久的 HTTP 连接、特殊的 MIME 类型和支持的客户端,以便能够随时将事件从服务器发送到客户端。与 webSockets 不同,服务器发送的事件只有一种方式(从服务器到客户端)。然后客户端将使用传统的 Ajax 调用以便能够将数据发送到服务器(而使用 webSocket 数据可以通过相同的 webSocket 连接以任一方式发送)。

这里很好地描述了服务器发送的事件是如何工作的:How do server-sent events actually work?

关于javascript - 对于推送通知,websocket 是强制性的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31035467/

有关javascript - 对于推送通知,websocket 是强制性的吗?的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  3. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  4. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  5. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  6. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

  7. ruby - 当前的 Ruby 方法是通过 super 调用的吗? - 2

    在运行时的方法中,有没有办法知道该方法是否已通过子类中的super调用?例如moduleSuperDetectordefvia_super?#whatgoeshere?endendclassFooincludeSuperDetectordefbarvia_super??'super!':'nothingspecial'endendclassFu"nothingspecial"Fu.new.bar#=>"super!"我如何编写via_super?,或者,如果需要,如何编写via_super?(:bar)? 最佳答案 可能有更好的方法

  8. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

  9. ruby - 强制 Ruby 不以标准形式/科学记数法/指数记数法输出 float - 2

    我遇到了同样的问题here对于python,但对于ruby​​。我需要输出这样一个小数字:0.00001,而不是1e-5。有关我的特定问题的更多信息,我正在使用f.write("Mynumber:"+small_number.to_s+"\n")输出到一个文件对于我的问题,准确性不是什么大问题,所以只做一个if语句来检查是否small_number那么更通用的方法是什么? 最佳答案 f.printf"Mynumber:%.5f\n",small_number您可以将.5(小数点右侧5位数字)替换为您喜欢的任何特定格式大小,例如,%8

  10. ruby - Ruby 导入的方法总是私有(private)的吗? - 2

    最好用一个例子来解释:文件1.rb:deffooputs123end文件2.rb:classArequire'file1'endA.new.foo将给出错误“':调用了私有(private)方法'foo'”。我可以通过执行A.new.send("foo")来解决这个问题,但是有没有办法公开导入的方法?编辑:澄清一下,我没有混淆include和require。另外,我不能使用正常包含的原因(正如许多人正确指出的那样)是因为这是元编程设置的一部分。我需要允许用户在运行时添加功能;例如,他可以说“run-this-app--includefile1.rb”,应用程序的行为将根据他在file1

随机推荐