我們使用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)題纵顾。