APP開(kāi)發(fā)聊天功能經(jīng)驗(yàn)之通信協(xié)議的實(shí)現(xiàn)方法,深圳APP開(kāi)發(fā)公司基于前面介紹移動(dòng)互聯(lián)網(wǎng)的特性,本文主要介紹一個(gè)優(yōu)秀的聊天功能App通信協(xié)議,主要有如下的要求:
·簡(jiǎn)化系統(tǒng)設(shè)計(jì)。
·提供可靠高效的消息傳輸,這個(gè)是重點(diǎn)關(guān)注的要求
·易于擴(kuò)展需求。
現(xiàn)在常用的聊天協(xié)議如下。
·XMPP:一個(gè)基于XML的消息協(xié)議,其曾經(jīng)被廣泛應(yīng)用于Gt alk、Facebook的聊天服務(wù),XMPP協(xié)議作為議個(gè)被廣泛使用的消息協(xié)議有大量的網(wǎng)絡(luò)資利和成熟開(kāi)源模塊在Android和iOS平臺(tái)上很方便就能集成XMPP協(xié)議。IM作為一個(gè)復(fù)雜的系統(tǒng)有方方面面需要考慮,使用成熟的協(xié)議能幫助開(kāi)發(fā)者避免很多問(wèn)題,提高開(kāi)發(fā)效率。
同時(shí)基于XML的XMPP協(xié)議的缺點(diǎn)也很明顯:耗費(fèi)流量。下面是XMPP協(xié)議的一部分。
從上面XMPPi添加好友的協(xié)議中可看到XMPP多么耗費(fèi)網(wǎng)絡(luò)流量
·MQTT: IBM開(kāi)發(fā)的聊天協(xié)議,一個(gè)簡(jiǎn)單的消息協(xié)議。
·類ActivitySync:微信實(shí)現(xiàn)的協(xié)議,省流量,性能高,但由于是私有協(xié)議,IM的所有功能都需要自己實(shí)現(xiàn)。
對(duì)于創(chuàng)業(yè)型的公司來(lái)說(shuō),從上面三種協(xié)議的對(duì)比可知,如果需要在最短州司內(nèi)實(shí)現(xiàn)聊天功能,除了使用環(huán)信、融云等第三方IM服務(wù)外最好選擇XMPP協(xié)議。
以下為兩個(gè)基于XMPP協(xié)議的著名開(kāi)源聊天服務(wù)器。
(1) Ejobberd,用Erlang語(yǔ)言開(kāi)發(fā),成熟穩(wěn)定,支持集群,支持多進(jìn)程、鬲并發(fā)。但由于其是基于小眾的Erlang語(yǔ)言,造成了很高的開(kāi)發(fā)和維護(hù)成本:招聘熟悉Erlang同時(shí)世熟悉聊天的研發(fā)人員不容易。
(2) Openfire:用Java語(yǔ)言開(kāi)發(fā),成熟穩(wěn)定,插件多,但其對(duì)內(nèi)存要求高,并發(fā)低,集群功能弱。
在App產(chǎn)品中如果因?yàn)槟承┰虿荒苁褂玫谌絀M服務(wù)(例如上級(jí)領(lǐng)導(dǎo)不信任第三方IM服務(wù)),那筆者建議不熟悉Erlang語(yǔ)言的開(kāi)發(fā)人員使用Openfire(如果熟悉Erlang語(yǔ)言當(dāng)然是用Ejobberd更好),畢竟熟悉Java的開(kāi)發(fā)人員還是挺多,而且在產(chǎn)品初期般并發(fā)量不高,等資金和工程卿充足后再對(duì)聊天系統(tǒng)進(jìn)行改造。
某些研發(fā)人員有追求完美的天性,但項(xiàng)目初期的環(huán)境決定了沒(méi)法打造完善的系統(tǒng),使用Openfire不是最完美的方案,但最起碼能先把聊天功能做出來(lái)。如果項(xiàng)目中必須使用自定義的通信協(xié)議,那么開(kāi)發(fā)人員先要解決的是TCP協(xié)議通信中常見(jiàn)的粘包問(wèn)題。
App的通信協(xié)議般是使用TCP協(xié)議,TCP協(xié)議是種面向連接、流,提供可靠服務(wù)的協(xié)議。
當(dāng)網(wǎng)絡(luò)上的數(shù)據(jù)包到達(dá)接收端后,程序會(huì)根據(jù)預(yù)先設(shè)置的緩沖區(qū)大小取數(shù)據(jù)。在圖9 8中,假設(shè)用戶緩沖區(qū)為15字節(jié),當(dāng)?shù)?個(gè)數(shù)據(jù)包(10字節(jié))和第2個(gè)數(shù)據(jù)包(10字節(jié))到達(dá)接收端后,程序根據(jù)緩沖區(qū)的大小(15字節(jié))取數(shù)據(jù),這樣緩沖區(qū)的數(shù)據(jù)包含了第1個(gè)數(shù)據(jù)包的全部數(shù)據(jù)(10字節(jié))和第2個(gè)數(shù)據(jù)包的部分?jǐn)?shù)據(jù)(5字節(jié)).當(dāng)把緩沖區(qū)的數(shù)據(jù)取出,其包含了第1個(gè)數(shù)據(jù)包的全部數(shù)據(jù)和第2個(gè)數(shù)據(jù)包的部分?jǐn)?shù)據(jù),于是產(chǎn)生粘包問(wèn)題。粘包產(chǎn)生原理如圖9-8所示。
例如第1個(gè)數(shù)據(jù)包的數(shù)據(jù)“1234567890”,第2個(gè)數(shù)據(jù)包的據(jù)“012345678”,從緩沖區(qū)取出全部數(shù)據(jù)后為“123456789001234”,如果沒(méi)有明顯的標(biāo)識(shí),程序根本不知道怎么在緩沖區(qū)中獲取第1個(gè)包的數(shù)據(jù)。解決這個(gè)問(wèn)題的通用方案是制定合理的腳潑格式,在每個(gè)數(shù)據(jù)包中標(biāo)明這個(gè)包的長(zhǎng)度,這樣程序就能準(zhǔn)確理解和處理包的數(shù)據(jù)
APP開(kāi)發(fā)公司程序員下面介紹的一種MySQL通信協(xié)議格式,其不但解決了粘包的問(wèn)題,而且都是高效的通信協(xié)議格式。
MySQL協(xié)議格式
MySQL協(xié)議中一個(gè)數(shù)據(jù)包的前3個(gè)字節(jié)是數(shù)據(jù)包長(zhǎng)度,第4個(gè)字節(jié)是數(shù)據(jù)包的序列號(hào),剩下的字節(jié)是數(shù)據(jù),如圖9-9所示。
APP開(kāi)發(fā)聊天功能通信9-9 MySOL協(xié)議格式
MySQL協(xié)議通過(guò)在數(shù)據(jù)包頭標(biāo)明了數(shù)據(jù)包長(zhǎng)度,程序就能在緩沖區(qū)通過(guò)截取正確的數(shù)據(jù)長(zhǎng)度來(lái)獲取個(gè)數(shù)據(jù)包。好了,APP開(kāi)發(fā)公司本文關(guān)于在制作APP聊天功能對(duì)于MySQL數(shù)據(jù)庫(kù)通訊協(xié)
議處理的方法與流程就介紹到這里,謝歡本站的朋友請(qǐng)持續(xù)關(guān)注本站。謝謝,博納網(wǎng)絡(luò)編輯整理。