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