查看完整版本: 如何做到Server向Client瀏覽器推送訊息?
頁: [1]

perry5502 發表於 2016-3-24 03:03 AM

如何做到Server向Client瀏覽器推送訊息?

常常看到許多網站都可以即時傳送訊息,例如 Facebook 聊天室、agar.io。
他們總不可能一直用 ajax 向伺服器確認有沒有新訊息吧!
HTTP 不就是 request 然後 response?
難道這其中有別種協定?
我最近聽說有 socket.io 這類的東西,
但是不懂它背後的原理,所以來請教大家囉。
還有除了 socket.io 還有哪些方法可以達到這種效果呢?

<div></div>

johnwanz 發表於 2016-3-24 09:09 AM

Wiki 推播技術

有一些介紹可以參考之.

chevylin0802 發表於 2016-3-24 10:00 AM

本帖最後由 chevylin0802 於 2016-3-24 10:05 AM 編輯

用瀏覽器介面存取的話
那可以說從1996年網路剛開始興起時就已經有了推播技術
根本不需要AJAX
雖然嚴格說起來它也就只是去呼叫javascript的refresh();函式
不過確實是老早就已經存在的方式
而E-Mail也有推播技術稱之為push
所以這並不是什麼新鮮事

只是後來為了考量到資料傳送的安全性問題
因此後來又有人用別種技術來發展
其中像是WebRTC就很常見於客服聊天室的使用

但是當你如果要採取<embed> tag或者早期微軟使用的ActiveX物件
當然就有可能可以嵌入不同的通訊方式
但它的問題在於這已經是屬於外掛的範圍
比如flash player也是屬於外掛程式
而能夠用java執行的程式也是屬於外掛程式

但是如果不一定要靠瀏覽器的話
那技術可多了去
不管是SIP, XMPP........都可以辦得到


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

theloserbm 發表於 2016-3-24 11:32 AM

以目前的瀏覽器和web server技術來說, 最好用的仍是用ajax去跟server要.
視程式的需求和使用者的數量, 我認為30秒到5分鐘刷新一次都是可以接受的.

如果需要更即時的如通訊軟體或是有太大量使用者, 可以考慮使用新的socket技術
比較正式的是HTML5的websocket, 你說的socket.io也是一個選擇
如果有興趣學習, 由這邊開始也是可以的, 相信將來會有用上的地方

其他的靠著不關閉HTTP而達成的方法, 個人不是很喜歡的, 感覺上會比較吃server的資源
不過可能是我誤解了, 這方面還請高手指正...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chevylin0802 發表於 2016-3-24 05:48 PM

本帖最後由 chevylin0802 於 2016-3-24 05:52 PM 編輯

theloserbm 發表於 2016-3-24 11:32 AM static/image/common/back.gif
以目前的瀏覽器和web server技術來說, 最好用的仍是用ajax去跟server要.
視程式的需求和使用者的數量, 我認 ...
不關閉連線的情況就是port一直被佔用
事實上HTTP的80 port只是listen port 並不是data transmit port
所以server其他方面的資源並不會真正被佔據多少
至於HTML5 是一個好方法
但是如果有人還在使用XP的IE的話
未必有支援HTML5 websocket
至於AJAX的作法
我不認為非常普遍
因為有很多的應用是需要使用到加密的需求
比如現在有不少關於物聯網上的應用
IoT的應用就常常有需要使用到推播功能
而那是需要進行加密的


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

tonnymarkx 發表於 2016-3-25 10:46 AM

樓主 你這問題的答案 應該是  gcm  (Google Cloud Messaging)
問一下 估狗 大神 你的答案 應該就會出現

sei18x 發表於 2016-3-30 11:49 PM

我講瀏覽器的部分好了。

Socket.io的背後就是websocket,其實也是一直和伺服器詢問狀態,但是他的通訊協定讓這些維持連線的資料傳輸量降到極低,所以是個不錯的選擇。

不過在不支援websocket的瀏覽器上Socket.io就會改以http輪循的方式來進行,對於簡單的應用程式來說都算是可以接受的作法,但是由於websocketk的所有主動傳輸都必須要透過伺服器來發送,就算是你要從使用者A送資料到使用者B中間還是要靠伺服器幫你,所以在一些負載比較大的應用情境下就需要小心使用。

去年開始普及的webRTC也就是為了解決這樣的問題所產生的,他可以讓瀏覽器直接傳輸資料而不需透過中介的伺服器(不過handshake還是需要),這樣子又讓許多應用情境變得更加可行,不過webRTC要考慮到網路穿透的問題,在某些狀況下他其實還是得有一台伺服器幫你傳遞資料的。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

sheauren 發表於 2016-4-10 10:49 AM

目前主要依賴websocket技術
如果server端是IIS asp.net的情況
目前最簡單的做法就是直接用signalR就可以直接滿足
client支援javascript/.net/android/ios平台
舊的瀏覽器未支援websocket的情況也會自動調整為long polling的方式

foneasion 發表於 2016-4-19 09:05 PM

之前比較開始是使用long polling的方式做
簡單來說,Clinet還是要發一個req給Server端,
不過Server要等到event發生的時候,才會回傳rep

websocket已經被納入標準中了,不過也要注意web server的版本是否有支援~
頁: [1]