基于Gin + WebSocket + MongoDB 的IM即时聊天Demo(一)

733 阅读2分钟

「这是我参与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"`
}

这一章我们先定义这些结构体类型,下一章我们将编写连接部分的代码。