2014-02-27 34 views
3

作爲一名Web開發人員,我藉助Redis或Pusher等第三方服務開發了聊天服務和其他一些實時協作服務。他們提供了簡單的API,我可以使用發佈/訂閱模型來實現Web服務器上的雙向通信。我想現在實現一個簡單的推送通知,而不使用任何第三方服務,但我不太確定如何實現這一點。的情況是如下:實時網絡編程:它是如何工作的?

  1. 後端是在Python(Django的)
  2. 用戶從另一用戶接收的私人消息。
  3. 無需刷新網頁瀏覽器即可通知收件人。

我的問題:

  1. 從這個post,Django的似乎是一個壞的選擇來實現這樣的功能,同時Node.js的是一個很好的一個。這是真的嗎?如果是這樣,爲什麼呢?
  2. 是否有可能打開從客戶端到服務器的WebSockets,以傾聽特定模型的某些更改? (例如消息模型中有新消息,更新DOM)

我非常感謝任何幫助!

+0

基本上你需要設置一個javascript間隔,並且每n秒調用一次ajax函數來檢查更新(新消息),這應該是php/python實現上的整體行爲,在節點中你不需要需要設置一個超時時間,因爲客戶端js會詢問節點服務器是否有新消息,並且只有當服務器發送更新時服務器纔會向您發送更新,這只是爲了讓您高興而有人給您一個更好的答案。如果是我,我會使用node.js,正是爲了創建它的這種應用程序。 – Zagen

+0

嗨Zarich,謝謝你的評論。但是,這不是投票嗎?我想實現一個實際的「實時」功能。 –

+0

是的,這就是爲什麼node.js在這種事情上更好,但等待真正的答案=) – Zagen

回答

4

WebSockets正是你想要的。然而,它們是瀏覽器的一個(相對)最近的增加,因此支持並不是無處不在。 WebSocket Support

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'); 
}); 

客戶

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套接字的後備功能。

在這種情況下,節點將比Django更快,但是如果這是您第一次參與Node,您可能會發現您的代碼庫在Django中更易於管理。用這樣的一系列回調來設計應用程序可能有點困難。我從未使用Django使用過WebSockets,但我在Tornado和WebSockets方面的經驗很差。

+0

謝謝丹!因此,在這種情況下,我是否在Django中使用Node.js,取代了Django的默認網絡服務器WSGI? –

+0

如果你打算在Django中使用Node,我會花點時間熟悉nginx,這樣你就可以將代理轉換爲Node或Django,具體取決於你正在處理的路由。如果您希望擴展到100k個併發連接,這一點尤其重要,因爲Node和Django的內置HTTP服務器都不如Nginx快。 –