使用TCP實(shí)現(xiàn)單聊群聊:

我們使用TCP實(shí)現(xiàn)單聊群聊,不過(guò)按我的經(jīng)驗(yàn),你最好先把當(dāng)前項(xiàng)目的UDP實(shí)現(xiàn)的整個(gè)項(xiàng)目備份一次以防萬(wàn)一。


一. 單聊群聊全部使用TCP完成:

所謂單聊就是兩個(gè)設(shè)備的互相通信,這個(gè)正是TCP的專項(xiàng)。

群聊的情況下,因?yàn)槲覀兪枪潭ǔ蓡T,固定用戶數(shù)量且最多12位同WIFI用戶,完全可以使用單聊TCP實(shí)現(xiàn)群聊,這樣還可以避免很多復(fù)雜的丟包掉線的問(wèn)題。


(1)疑問(wèn)1: 假設(shè)IP他們有變動(dòng)怎么辦?

首先,可以確定他們能通過(guò)紀(jì)律要求實(shí)現(xiàn)IP固定,假設(shè)真有變動(dòng),我們討論過(guò)這個(gè)情況,可以把IP范圍做成某種配置,用戶可以統(tǒng)一修改配置(這后面遇到再說(shuō))


(2)單聊TCP需要長(zhǎng)連接嗎?

目前感覺(jué)不需要,按需連接。需要給誰(shuí)發(fā)就連接誰(shuí)。


(3)TCP連接斷開(kāi)了怎么處理?

需要寫一個(gè)工具類,TcpTool,給一個(gè)ip地址連接對(duì)方,連接成功后,保存這個(gè)連接對(duì)象下次直接使用,需要在工具類的內(nèi)部處理以下情況:

a.?連接指定ip,如果ip對(duì)應(yīng)本地沒(méi)有歷史連接對(duì)象,創(chuàng)建連接對(duì)象,假設(shè)創(chuàng)建失敗,說(shuō)明對(duì)方不在線。終止發(fā)消息。如果成功,可以發(fā)消息。

b. 連接指定ip,如果ip對(duì)應(yīng)本地有歷史連接對(duì)象,直接返回使用。

c.?連接指定ip,如果ip對(duì)應(yīng)本地有歷史連接對(duì)象,直接使用,遇到對(duì)方又掉線,需要清除本地連接對(duì)象,然后回到步驟a.

所以這個(gè)方法,如果是我來(lái)寫,大概長(zhǎng)這樣:

function sendMessageToIP(ip: ?String, ?message: String, ?closure: Huidiao) {

? ? let link = this.linkMap[ip] //從歷史中取

? ? if(link == null){ //歷史中沒(méi)有

? ??????link = createLink(ip) ?//創(chuàng)建指定ip的連接

? ? ? ??this.linkMap[ip] = link //記錄到本地,下次使用

?? ? }

? ? if(link.error){ ?//這個(gè)連接有錯(cuò)誤

? ??????this.linkMap[ip] = null //清空錯(cuò)誤無(wú)用的記錄

? ? ? ?closure(101,"連接錯(cuò)誤") //回調(diào)拋出錯(cuò)誤

? ? ? }else{ ?//連接正常,直接發(fā)消息

????????link.sendMessage(message)? ? ? ??

? ??????closure(102,"發(fā)送成功") //回調(diào)拋出錯(cuò)誤

? ? ? ?}

}


(4)群聊怎么發(fā)群發(fā)消息?

遍歷群成員,for循環(huán)單個(gè)發(fā)消息。


(5)我怎么區(qū)分單聊群聊消息?如何顯示單聊群聊數(shù)據(jù)?

這個(gè)非常簡(jiǎn)單,收到消息后,數(shù)據(jù)里面有各種字段標(biāo)明這是單聊還是群聊,數(shù)據(jù)來(lái)了直接存入數(shù)據(jù)庫(kù),然后從數(shù)據(jù)庫(kù)讀取最新數(shù)據(jù)就可以了。數(shù)據(jù)來(lái)了不要直接刷新到UI,一定是先存入數(shù)據(jù)庫(kù),然后數(shù)據(jù)庫(kù)根據(jù)各種單聊用戶ID或者群聊群ID自動(dòng)篩選得到正確的數(shù)據(jù)。


(6)需要每個(gè)人需要?jiǎng)?chuàng)建12*12個(gè)鏈接嗎?

不需要,首先,A連接B成功后,B自動(dòng)連接A成功,兩者可以互發(fā)消息,公平對(duì)等。

其實(shí)不需要一來(lái)就各種互聯(lián),按上面的說(shuō)明,可以需要給誰(shuí)發(fā)再來(lái)連不晚,這個(gè)連接很快。

可能需要你實(shí)際操作感受下才能更好的理解。


單聊TCP + 數(shù)據(jù)庫(kù)直接搞定所有問(wèn)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容