頁:
[1]
如何做到Server向Client瀏覽器推送訊息?
常常看到許多網站都可以即時傳送訊息,例如 Facebook 聊天室、agar.io。他們總不可能一直用 ajax 向伺服器確認有沒有新訊息吧!
HTTP 不就是 request 然後 response?
難道這其中有別種協定?
我最近聽說有 socket.io 這類的東西,
但是不懂它背後的原理,所以來請教大家囉。
還有除了 socket.io 還有哪些方法可以達到這種效果呢?
<div></div> Wiki 推播技術
有一些介紹可以參考之. 本帖最後由 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> 以目前的瀏覽器和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: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> 樓主 你這問題的答案 應該是 gcm (Google Cloud Messaging)
問一下 估狗 大神 你的答案 應該就會出現
我講瀏覽器的部分好了。
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> 目前主要依賴websocket技術
如果server端是IIS asp.net的情況
目前最簡單的做法就是直接用signalR就可以直接滿足
client支援javascript/.net/android/ios平台
舊的瀏覽器未支援websocket的情況也會自動調整為long polling的方式 之前比較開始是使用long polling的方式做
簡單來說,Clinet還是要發一個req給Server端,
不過Server要等到event發生的時候,才會回傳rep
websocket已經被納入標準中了,不過也要注意web server的版本是否有支援~
頁:
[1]