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

Max*_*s S 4 javascript django push-notification websocket node.js

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

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

我的问题:

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

我非常感谢任何帮助!

Dan*_*nce 5

WebSockets 正是您在这里想要的。然而,它们是(相对)最近添加到浏览器的,因此,支持并不普遍。网络套接字支持

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

因为 Node.js 是 Javascript 并且你很有可能用 Javascript 编写客户端,所以它适合作为编写耦合组件的明智选择,例如在这种情况下。

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

服务器

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

客户

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');
});
Run Code Online (Sandbox Code Playgroud)

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

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