实时网络编程:它是如何工作的?

2023-12-07

作为一名 Web 开发人员,我借助 Redis 或 Pusher 等第三方服务开发了聊天服务和其他一些实时协作服务。它们提供了简单的 API,我可以使用发布/订阅模型来实现通过网络服务器的双向通信。我现在想实现一个简单的推送通知,而不使用任何第三方服务,但我不太确定如何实现这一点。情况如下:

  1. 后端是Python (Django)
  2. 用户收到来自另一个用户的私人消息。
  3. 收件人无需刷新网络浏览器即可收到通知。

我的问题:

  1. 由此post,Django 似乎是实现此类功能的一个糟糕选择,而 Node.js 是一个不错的选择。这是真的吗?如果是,那是为什么呢?
  2. 是否可以打开从客户端到服务器的 websockets,以侦听特定模型的某些更改? (例如,当消息模型中有新消息时,更新 DOM)

我非常感谢任何帮助!


WebSockets 正是您想要的。然而,它们是(相对)最近才添加到浏览器中的,因此支持并不普遍。WebSocket 支持

Websocket 模型允许您使用 Web 浏览器将套接字从服务器连接到客户端,然后从服务器发送消息并在客户端异步接收消息,反之亦然。

由于 Node.js 是 Javascript,并且您很可能会用 Javascript 编写客户端,因此它适合作为编写耦合组件的明智选择,例如在本场景中。

最流行的 WebSocket 库是Socket.io它是为与 Node.js 一起使用而构建的。使用 Socket.io,您的通知模型将如下所示:

Server

io.sockets.on('connection', function (socket) {
  socket.emit('notification', { name: 'Notification', message: 'It\'s here');
});

Client

var notifications = document.getElementById('nlist');
socket.on('notification', function(notification) {
   var div;
   // make some DOM changes
   document.title = notification.name;
   div = document.createElement('div');
   div.innerHTML = notification.message;
   notifications.appendChild(div);
   socket.emit('received-notification');
});

Socket.io 允许您使用自定义事件名称,如此处所示,这使得设计通信 API 变得更加容易。在用户没有 Web 套接字的情况下,它还具有 XHR 长轮询和 Flash 套接字的后备功能。

在这种情况下,Node 会比 Django 更快,但如果这是您第一次尝试 Node,您可能会发现 Django 中的代码库更易于管理。设计具有一系列这样的回调的应用程序可能有点困难。我从未在 Django 中使用过 WebSockets,但我对 Tornado 和 WebSockets 的体验很差。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实时网络编程:它是如何工作的? 的相关文章

  • 通过搜索查找下一个文本并突出显示不起作用

    当在搜索框中搜索任何文本时 它可以找到并突出显示正确的文本 但是当搜索下一个 新文本时 它无法找到下一个 新文本 再次搜索时它不起作用 我无法找到问题 这JS below JS button search click function va
  • 标点符号加载“动画”,javascript?

    我正在寻找一种好方法来显示一些标点符号加载 动画 我想要的是这样的 This will display at second 1 Waiting for your input This will display at second 2 Wai
  • Backbone.js 与 Google 地图 - 有关此问题和侦听器的问题

    我有一个为 Google Maps v3 创建的模块 我正在尝试将其转换为 Backbone js 视图构造函数 到目前为止 这是我的视图模块 我将解释代码后遇到的问题 pg views CreateMap Backbone View ex
  • 如何在WebBrowser控件中注入Javascript?

    我试过这个 string newScript textBox1 Text HtmlElement head browserCtrl Document GetElementsByTagName head 0 HtmlElement scrip
  • 无法从 Twin.macro 中的 Prop 获取值

    您可以在这里查看我正在尝试执行的操作的示例 https codesandbox io s vibrant leaf qj8vz https codesandbox io s vibrant leaf qj8vz 注意 这个特定的例子使用双宏
  • 从 url 角度加载模板并在 div 内编译

    由于我是 Angular JS 的新手 我想知道如何加载外部模板并将其与一些数据一起编译到目标中div 例如我有这个模板
  • heroku node.js bash:节点:找不到命令

    在 cedar stack 上的 heroku 上部署我的应用程序似乎存在一个奇怪的问题 我的节点进程甚至没有被调用 我的Proc文件如下 web node web js 和我的 package json 文件 name fuuzik ve
  • 如果字段值在外部列表中,Django 会注释布尔值

    想象一下我有这个 Django 模型 class Letter models Model name models CharField max length 1 unique True 还有这个列表 vowels a e i o u 我想查询
  • 使用节点护照进行两次不同的登录

    我对两个站点 前台站点和后台 有相同的应用程序 两个站点都需要不同的登录条件 因为后台需要将 is admin 值设置为 true 这是我的登录方法 module exports verifyCredentials function use
  • 测量填写部分的时间 - 谷歌表单

    我正在尝试使用谷歌表单进行研究调查问卷 对于某些部分 我想自动测量用户填写所需的时间 谷歌表单中没有这样的选项 我尝试复制表单源 并用 javascript 填充时间 但它不起作用 跨源问题 未能成功托管复制的表单 如何做到 我如何衡量回答
  • apollo 客户端从存储中删除而不发生突变

    我需要通过 id 从本地存储中删除一条 记录 而不使用突变 因为服务器不支持突变 我尝试像这样手动访问商店 delete this apolloClient store getState apollo data 1112 这会删除记录 但是
  • 您网站上的自定义 jQuery 脚本有多少行代码?多少才算是太多呢?

    对于我们的网站 我使用了大量 jQuery 现在我正在查看基础库顶部的 340 行 jQuery 代码 多少是太多了 我将添加更多内容 我什么时候开始尝试压缩代码并最终转向 OOP 行数并不意味着什么 重要的是你实际上在做什么 您可能拥有
  • 两个日期之间间隔 15 分钟 javascript

    问题 我需要将两个日期 时间戳之间的所有 15 分钟时隙 日期格式 2016 08 10 16 00 00 创建为 HH mm 格式的数组 其中分钟限制为 00 15 30 45 示例 中午 12 30 到下午 2 30 将 gt 12 3
  • Node.js 中的startsWith:类型错误:未定义不是函数

    我在 Node js 中使用startsWith 时遇到错误 脚本sw js startswith var str Sein oder nicht sein dass ist hier die Frage console log str s
  • 替换打字稿中字符串中字符的所有实例?

    我正在尝试用 x 字符替换电子邮件中的所有句号 例如 电子邮件受保护 cdn cgi l email protection 将变为 myxemail emailxcom 电子邮件设置为字符串 我的问题是它不只是替换句号 而是替换每个字符 所
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 在部分渲染时执行 JavaScript

    我有一些 JavaScript 代码 我想在用户单击其文件夹之一后执行 它会触发 show 操作和 show js erb 从而呈 现部分内容 Show js erb 当用户单击其文件夹之一时触发 如下所示 body append 它成功注
  • 在 React JSX 中返回配对元素

    问题 在 React 中 您希望通过映射数组来创建 DOM 结构 但数组中的每个项目应返回 2 个元素 例如 import React from react import from lodash let Component React ex
  • 在 Javascript 中创建数组

    我对 javascript 不太熟悉 并且在用 javascript 制作 2d 或者也许我可能需要 3d 数组时遇到了一些麻烦 我目前需要收集 2 条信息 一个 ID 和一个值 因此我创建了以下内容 var myArray var id
  • 右列固定的 Div 表

    我最近接手了一个非营利网站作为一个项目 我正在使用一个现有的网站 所以我必须使用很多已经编程的东西 所以我所要做的就是创建设计 I made a diagram of basically what I can t figure out ho

随机推荐

  • 如何在 iOS 上截取代码截图? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如何从代码中截取屏幕截图 http www iphonedevsdk com forum iphone sdk development 2353 possible make sc
  • 查找UDP数据包的源IP/进程

    我在用recvfrom 在我的 C 程序中接收来自多个客户端的 UDP 数据包 这些客户端可以使用自定义用户名登录 一旦他们登录 我希望他们的用户名与唯一的客户端进程配对 这样服务器就可以根据数据包的来源自动知道用户是谁 我如何从收到的数据
  • Android viewpager 检测滑动超出范围

    在我的 Android 应用程序中 我使用 viewpager 进行图像滑动 我的要求是 如果用户滑出第一页和最后一页 则活动应该完成 我已经采取了这个example 但方法setOnSwipeOutListener在我的活动中没有被调用
  • 通过 segue 传递变量? Xcode 8 斯威夫特 3

    所以我正在创建一个闹钟 一个视图控制器是表视图 另一个视图控制器由带有提交按钮的 UIDatePicker 组成 目标是当用户单击提交按钮时 它将日期保存在日期选择器上 除了保存日期之外 它还是表视图控制器的一个序列 我正在尝试显示保存为单
  • Windows API 代码包 TaskDialog 缺少图标

    我的图标TaskDialog缺失 And in the taskbar 我的代码是这样的 using Microsoft WindowsAPICodePack using Microsoft WindowsAPICodePack Dialo
  • 如何编写(flutter web)代码以便 JavaScript 文件在我的本地计算机上运行?

    我构建了一个简单的 flutter web 应用程序 它在 github io 和localhost server flutter run d chrome 如果我创建一个发布版本 flutter build web 将应用程序转换为 基本
  • 页面对象 gem:根据可见性识别具有相同属性的对象

    我有一个包含以下 html 的文本框 这id是动态的 我无法使用它 我在文本框中填写了一些文本
  • SQL 网络接口,错误:26 - 定位为 MD​​F 文件指定的服务器/实例时出错

    我添加了一个数据库文件 mdf 使用 Visual Studio 内置功能添加到我的应用程序 数据库位于App Data文件夹 它运行良好 但是当我发布它并将其上传到服务器时 它会出现此错误 发生网络相关或特定于实例的错误 建立与 SQL
  • 如何减少 p:ajax 期间的请求负载p:数据表分页

    我正在使用 JSF 2 2 和 Primefaces 5 1 有一个可编辑的 primefaces 数据表 启用了分页
  • 如何根据其他列向列添加值

    在 pandas 中 如何根据其他列中的字符串向列添加值 类似于二维切片操作 例如 有一个像这样的数据框 df pd DataFrame name foo foo bar bar colx 1 2 3 4 coly 5 6 7 8 如何将
  • 完全更改当前 PowerShell 会话的语言(包括文化)

    我的Win 10系统有西班牙语 我的意思是完全用英语操作 PowerShell 会话 在我尝试过的一切 见下文 中 我设法改变了UICulture to en US对于当前会话 但不是Culture 有什么办法可以永久改变Culture对于
  • 将 OnClick 事件添加到 ASP.NET 控件

    我想创建OnClick为我的活动panel 到目前为止 大多数谷歌结果看起来或多或少是这样的 将 onclick 事件添加到 aspnet 标签 有什么方法可以从 javascript 或面板属性调用代码隐藏函数吗 因为我想将用户重定向到新
  • 如何启动 PHP 类并在多个文件中使用它?

    我现在很困惑 在我关于这个问题的上一篇文章中 答案是使用单例来确保对象仅启动一次 但我遇到了相反的问题 如果我有一个名为索引 php然后我将这些文件包含进去 类1 php 类2 php 类3 php 类4 php In 索引 php我会有
  • 具有多个条件的 COUNTIF

    您能告诉我如何在多个条件下使用 COUNTIF 吗 我的提案 左 显示了一项标准 不同区域 的公式 但是 我有兴趣计算每个不同月份的不同区域 两个标准 右侧 期望的结果 您可以使用COUNTIFS instead 1 COUNTIFS A
  • 为什么无穷大在 Windows 10 控制台中打印为“8”?

    我正在测试除法返回的内容 包括零 即0 1 1 0 and 0 0 为此 我使用了类似于以下内容的内容 Console WriteLine 1d 0d 然而这段代码打印8 not Infinity或其他一些字符串常量 例如PositiveI
  • PropertyGrid - 根据另一个属性值更改下拉属性编辑器的项目

    我正在尝试在自定义组件中实现下拉属性 并且我使用了这个答案 and 这个答案作为指导 到目前为止 我设法让它工作 并在下拉列表中使用预定义的项目 但我仍然需要弄清楚如何更改下拉列表中的项目 这是我到目前为止的代码 从上面提到的链接构建 Ty
  • 静态javascript未在jade中呈现(使用express/node.js)

    我希望你一切都好 我突然无法在 jade 模板中渲染任何外部 javascript 为了弄清楚事情的真相 我将其精简到最低限度 节点0 6 11 Express 2 5 8 jade 0 20 3 app js var express re
  • 协调两个对象集合

    我有一个表单 用户可以在其中使用 DataGrid 修改对象集合 打开表单时 我会创建原始集合的深层副本 如果按下 取消 按钮 我只会丢弃该副本 问题是 当按下 确定 按钮时 我必须协调可能的更改 修改现有对象的属性 新对象添加到集合中的任
  • Log4j JDK 日志适配器:在启动过程后期应用 LogManager 系统属性

    我有一个运行 Web 应用程序的 WebSphere 应用程序服务器 我从 Eclipse 启动服务器 该应用程序中的主要日志记录框架是 log4j2 但也有一些使用 java util logging 的第三方库 我想将这些日志重定向到
  • 实时网络编程:它是如何工作的?

    作为一名 Web 开发人员 我借助 Redis 或 Pusher 等第三方服务开发了聊天服务和其他一些实时协作服务 它们提供了简单的 API 我可以使用发布 订阅模型来实现通过网络服务器的双向通信 我现在想实现一个简单的推送通知 而不使用任