WebSocket chatRoom with Django-Channels(一)

Chih Sean Hsu
十十二夜
Published in
32 min readMar 31, 2019

--

就這樣,感覺應該是很順利地產出了第二篇文。在打這篇文前也做了個決定,打算採用基礎知識與實際應用交錯地發佈方式,我們的第一篇文是Concurrency in Python是關於基礎知識的部分,雖然今天的文也會有些Polling的基礎知識,但主要重點是在用WebSocket的技術實際建立一套能動的系統(程式)。

本專題文章應該會分兩篇(以上),第一篇著重在介紹WebSocket及如何使用Django-Channels建立Python Django的WebSocket Server,第二篇後會將建立好的雛形進行更完善的處理(資料庫、前端及部署),所以如果已經了解(或沒興趣)資料庫及前端技術的可以忽略第二篇。

另外可能需要具備一點Django得基本觀念。

簡單的說一下為何會用到WebSocket這個東西以及他的一些前身等等。

現在很多網頁都會使用到類似的相關技術,像是線上聊天室、股票的實時線圖等等。在WebSocket出現之前是一種稱做Polling(輪詢)的一種東西,他是一種定期由Client(Browser)向Server送出請求的方法。

以下對常見的polling、comet(streaming、long-polling)方式及WebSocket進行簡單的介紹。

先解釋client及server,Client為使用者端,通常是browser(瀏覽器)。而Server是WebServer那方。

Polling(輪詢)

最簡單的方式,在任何瀏覽器上都可以實行。主要使用的方法為JavaScripts直接呼叫 setInterval()setTimeout() 來實作,在這邊建議是使用 setTimeout() 讓Client訂一個時間定期向Server傳送Request或用AJAX進行網頁的資料更新等等。這方法的優點就像先前所述,在所有瀏覽器都能使用,即使是古老的IE9都能夠做到。但缺點就是會消耗過多多餘的資源,大部分寄出請求得到的Response是重複的內容。而且假如是龐大的服務,可能同時使用的客戶多達上千個Server將同時一次得到上千個請求,會造成很大的負荷。

function() {  setTimeout(() => {    $ajax({ ... })
}, 5000)
}

Comet(彗星?)

在中文的翻譯就是彗星,簡單的來說就是他所送出的Request就像彗星一樣有長長的尾巴,他是將Request連線的時間拉長。此種方法在會將一般傳統webServer(ex: Apache…

--

--