「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。
github地址:github.com/CocaineCong…
B站教程地址:www.bilibili.com/video/BV1BP…
写在前面
这个项目是基于WebSocket + MongoDB + MySQL + Redis。 业务逻辑很简单,只是两人的聊天。
MySQL
用来存储用户基本信息MongoDB
用来存放用户聊天信息Redis
用来存储处理过期信息
1. WebSocket原理
WebSocket
是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手。 握手成功后,数据就直接从TCP
通道传输,与HTTP
无关了。即:WebSocket
分为握手和数据传输阶段。 即进行了HTTP握手 + 双工的TCP连接。
WebSocket 是一种在单个TCP连接上进行全双工通信
的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
如果只是想左图这样的不断发送http请求,轮询的效率是非常低,非常浪费资源,所以就有了websocket协议了,建立在 TCP 协议之上,服务器端的实现比较容易。
WebSocket协议一旦建立之后,互相沟通所消耗的请求头是很小的,服务器向客户端推送消息的功耗就小了。
2. 具体流程
2.1 定义类型
- 发送消息的结构体
type SendMsg struct {
Type int `json:"type"`
Content string `json:"content"`
}
type是指类型,本项目中定义的1是指发送消息,2是指获取历史消息,所以有这个type的说法。
- 回复消息的结构体
type ReplyMsg struct {
From string `json:"from"`
Code int `json:"code"`
Content string `json:"content"`
}
- 用户结构体
type Client struct {
ID string
SendID string
Socket *websocket.Conn
Send chan []byte
}
- 广播类(包括广播内容和源用户)
type Broadcast struct {
Client *Client
Message []byte
Type int
}
- 用户管理
type ClientManager struct {
Clients map[string]*Client
Broadcast chan *Broadcast
Reply chan *Client
Register chan *Client
Unregister chan *Client
}
- 信息转JSON (包括:发送者、接收者、内容)
type Message struct {
Sender string `json:"sender,omitempty"`
Recipient string `json:"recipient,omitempty"`
Content string `json:"content,omitempty"`
}
这一章我们先定义这些结构体类型,下一章我们将编写连接部分的代码。