來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
首先,在你的例子里使用ajax方式訪(fǎng)問(wèn)服務(wù)器是可行的,只要你的服務(wù)器端返回的response包含正確的Access-Control-Allow-Origin這條header。詳情參見(jiàn)HTTP access control (CORS)。
然后,關(guān)于實(shí)時(shí)聊天的需求,可能的解決方案除了long-poll什么的之外,大約有以下兩種:
1、利用先進(jìn)的WebRTC
WebRTC是一種新的Web標(biāo)準(zhǔn),用于實(shí)現(xiàn)Web環(huán)境中的實(shí)時(shí)點(diǎn)對(duì)點(diǎn)通信,可以傳輸數(shù)據(jù)、語(yǔ)音和視頻。有一些第三方j(luò)avascript庫(kù)可以方便的支持WebRTC,比如PeerJS - Simple peer-to-peer with WebRTC。但是!可惜的是,目前在“相對(duì)先進(jìn)”的移動(dòng)端的瀏覽器世界中,也只有Android Chrome 37支持它。想要利用它的優(yōu)秀特性,可能只能再等等。
參見(jiàn):Can I use... Support tables for HTML5, CSS3, etc。
2、自行通過(guò)WebSockets實(shí)現(xiàn)
WebSockets是一種為實(shí)時(shí)雙向數(shù)據(jù)傳輸建立的Web傳輸協(xié)議,它使得服務(wù)器端能夠主動(dòng)push數(shù)據(jù)到瀏覽器端。WebSockets目前在移動(dòng)端的支持要略好一點(diǎn),iOS 7以上和Android 4.4以上都可以支持。如果使用Crosswalk打包,應(yīng)該可以在更多版本的Android系統(tǒng)上使用。基于WebSockets的第三方庫(kù)也不少,比如http://binaryjs.com/。
參見(jiàn):Can I use... Support tables for HTML5, CSS3, etc。
當(dāng)然,如果想要使用最傳統(tǒng)和古老的純HTTP請(qǐng)求方式,也不是不可以實(shí)現(xiàn)。瀏覽器端以固定的頻率向服務(wù)器請(qǐng)求數(shù)據(jù),可以在一定程度上模擬實(shí)時(shí)通信。但是這樣的缺點(diǎn)也十分明顯,資源開(kāi)銷(xiāo)過(guò)大,而且很難實(shí)現(xiàn)真正的實(shí)時(shí)(其實(shí)也是資源開(kāi)銷(xiāo)……)。其他的,Java applets和Flash在移動(dòng)端可能不是很可行的選項(xiàng)。
所以說(shuō),如果想要實(shí)現(xiàn)一個(gè)類(lèi)似QQ群的應(yīng)用,在移動(dòng)端瀏覽器環(huán)境中目前可能的最佳選擇大約是基于WebSockets的方案。