第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

首頁(yè) 慕課教程 Netty 教程 Netty 教程 IM 聊天系統(tǒng)設(shè)計(jì)

IM 聊天系統(tǒng)設(shè)計(jì)

1. 前言

經(jīng)過(guò)前面章節(jié)的學(xué)習(xí),Netty 的知識(shí)點(diǎn)基本上講解完了,從本節(jié)開(kāi)始,主要通過(guò)一個(gè) IM 聊天系統(tǒng)來(lái)把之前的知識(shí)點(diǎn)串聯(lián)一遍,加深同學(xué)們對(duì)于 Netty 的理解。

2. 需求分析

業(yè)務(wù)場(chǎng)景: 模擬微信聊天,每個(gè)客戶端和服務(wù)端建立連接,并且可以實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信(單聊),點(diǎn)對(duì)多點(diǎn)通信(群聊)。

設(shè)計(jì)思路: 我們要實(shí)現(xiàn)的是點(diǎn)(客戶端)對(duì)點(diǎn)(客戶端)的通訊,但是我們大部分情況下接觸的業(yè)務(wù)都是客戶端和服務(wù)端之間的通訊,客戶端只需要知道服務(wù)端的 IP 地址和端口號(hào)即可發(fā)起通訊了,那么客戶端和客戶端應(yīng)該怎么去設(shè)計(jì)呢?

思考:難道是手機(jī)和手機(jī)之間建立通訊連接,互相發(fā)送消息嗎?

這種方案顯然不是很好的方案,第一: 客戶端和客戶端之間通訊,首先需要確定對(duì)方的 IP 地址和端口號(hào),顯然不是很現(xiàn)實(shí)。第二: 即使有辦法拿到對(duì)方的 IP 地址和端口號(hào),那么每個(gè)點(diǎn)(客戶端)既作為服務(wù)端還得作為客戶端,無(wú)形之中增加了客戶端的壓力。

其實(shí),我們可以使用服務(wù)端作為中轉(zhuǎn)站,由服務(wù)端主動(dòng)往指定客戶端推送消息,如果是這種模式的話,那么 Http 協(xié)議是無(wú)法支持的,Http 是無(wú)狀態(tài)的,只能一請(qǐng)求一響應(yīng)的模式,只能使用 TCP 協(xié)議去實(shí)現(xiàn)了。

3. 單聊思路設(shè)計(jì)

3.1 架構(gòu)圖

圖片描述

流程解析

  1. 實(shí)現(xiàn)客戶端和客戶端之間通訊,那么需要使用服務(wù)端作為通訊的中轉(zhuǎn)站,每個(gè)客戶端都必須和服務(wù)端建立連接;
  2. 每個(gè)客戶端和服務(wù)端建立連接之后,服務(wù)端保存用戶 ID 和通道的映射關(guān)系,其中用戶 ID 作為客戶端的唯一標(biāo)識(shí);
  3. 客戶端 A 往客戶端 B 發(fā)送消息時(shí),先把消息發(fā)送到服務(wù)端,再有服務(wù)端往客戶端 B 進(jìn)行推送。但是,服務(wù)端如何找到客戶端 B 呢?
    3.1 客戶端 A 往服務(wù)端發(fā)送消息時(shí),消息攜帶的信息有:客戶端 A 用戶 ID、客戶端 B 用戶 ID、消息內(nèi)容。這樣服務(wù)端就能順利找到服務(wù)端 B 的通道并且進(jìn)行推送消息了。

3.2 消息推送流程

每個(gè)客戶端和服務(wù)端建立連接的時(shí)候,必須把個(gè)人用戶信息上傳到服務(wù)端,由服務(wù)端統(tǒng)一保存映射關(guān)系,如果某個(gè)客戶端下線了,則服務(wù)端監(jiān)聽(tīng)到連接斷開(kāi),刪除對(duì)應(yīng)的映射關(guān)系。其次,發(fā)起群聊的時(shí)候,需要傳遞 touser 字段,服務(wù)端根據(jù)該字段在映射表里面查找到對(duì)應(yīng)的連接通道并發(fā)起消息推送。

圖片描述

4. 群聊思路設(shè)計(jì)

群聊指的是一個(gè)組內(nèi)多個(gè)用戶之間的聊天,一個(gè)用戶發(fā)到群組的消息會(huì)被組內(nèi)任何一個(gè)成員接收 。具體架構(gòu)思路如下所示:

圖片描述

群聊流程解析:

  1. 群聊其實(shí)和單聊整體上思路都是一致的,都是需要保存每個(gè)用戶和通道的對(duì)應(yīng)關(guān)系,方便后期通過(guò)用戶 ID 去查找到對(duì)應(yīng)的通道,再跟進(jìn)通道推送消息;
  2. 那么如何把消息發(fā)送給多個(gè)組內(nèi)的成員呢?其實(shí)很簡(jiǎn)單,服務(wù)端再保存另外一份映射關(guān)系,那就是聊天室和成員的映射關(guān)系。發(fā)送消息時(shí),首先根據(jù)聊天室 ID 找到對(duì)應(yīng)的所有成員,然后再跟進(jìn)各個(gè)成員的 ID 去查找到對(duì)應(yīng)的通道,最后由每個(gè)通道進(jìn)行消息的發(fā)送;
  3. 成員加入某個(gè)群聊組的時(shí)候,往映射表新增一條記錄,如果成員退群的時(shí)候則刪除對(duì)應(yīng)的映射記錄;
  4. 通過(guò)上面的架構(gòu)圖發(fā)現(xiàn),群聊和單聊相比,其實(shí)就是多了一份映射關(guān)系而已。

5. 小結(jié)

本節(jié)主要掌握單聊和群聊的核心設(shè)計(jì)思路

單聊: 主要是服務(wù)器保存了一份用戶和通道之間的映射關(guān)系,發(fā)送消息的時(shí)候,根據(jù)接收人 ID 找到其對(duì)應(yīng)的通道 Channel,Channel 的 write () 可以給客戶端發(fā)送消息;
群聊: 保存兩份關(guān)系,分別是用戶 ID 和 Channel 之間的關(guān)系、群組 ID 和用戶 ID 的關(guān)系。推送消息的時(shí)候,首先根據(jù)聊天組 ID 找到其對(duì)應(yīng)的成員,遍歷每個(gè)成員再進(jìn)行找出其對(duì)應(yīng)的通道即可。

整體來(lái)說(shuō),思路還是很簡(jiǎn)單的,掌握了該設(shè)計(jì)思路以后,你會(huì)發(fā)現(xiàn)設(shè)計(jì)一款 IM 聊天軟件其實(shí)也不是很復(fù)雜。

特殊說(shuō)明:我們的實(shí)戰(zhàn)案例,主要是帶大家理解 IM 聊天的設(shè)計(jì)思路和大體的實(shí)現(xiàn)思路,因此后面代碼部分主要是基于控制臺(tái)去實(shí)現(xiàn),而不是真正的手機(jī)端去實(shí)現(xiàn)。