## go-gin-chat(Gin+websocket 的多人聊天室)
练手小项目,为熟悉Gin框架跟websocket使用
### Feature
- 登录/注册(防止重复登录)
- 群聊(多房间、支持文字、emoji、文件(图片)上传
- 私聊(消息提醒)
- 历史消息查看(点击加载更多)
- 心跳检测及自动重连机制
- go mod 包管理
- 支持 http/ws 、 https/wss
## 结构
```
.
|-- LICENSE.txt
|-- conf #配置文件
| |-- config.go
| `-- config.go.env
|-- controller
| |-- ImageController.go
| `-- IndexController.go
|-- main.go
|-- models
| |-- message.go
| |-- mysql.go
| `-- user.go
|-- routes
| `-- route.go
|-- services # 简单逻辑处理服务层
| |-- helper
| | `-- helper.go
| |-- img_kr
| | `-- imgKr.go
| |-- message_service
| | `-- message.go
| |-- session
| | `-- session.go
| |-- user_service
| | `-- user.go
| `-- validator
| `-- validator.go
|-- sql
| `-- go_gin_chat.sql
|-- static #静态文件 js 、css 、image 目录
|-- views
| |-- index.html
| |-- login.html
| |-- private_chat.html
| `-- room.html
`-- ws websocket 服务端主要逻辑
|-- ServeInterface.go
|-- go_ws
| `-- serve.go # websocket服务端处理代码
|-- primary
| `-- start.go # 为了兼容新旧版 websocket服务端 的调用策略
|-- serve.go # 初版websocket服务端逻辑代码,可以忽略
`-- ws_test #本地测试代码
|-- exec.go
`-- mock_ws_client_coon.go
```
- 定义客户端信息的结构体
```go
type wsClients struct {
Conn *websocket.Conn `json:"conn"`
RemoteAddr string `json:"remote_addr"`
Uid float64 `json:"uid"`
Username string `json:"username"`
RoomId string `json:"room_id"`
AvatarId string `json:"avatar_id"`
}
//
```
- 定义全局变量
```go
// client & serve 的消息体
type msg struct {
Status int `json:"status"`
Data interface{} `json:"data"`
Conn *websocket.Conn `json:"conn"`
}
// 上线、离线、消息发送事件 的 无缓冲区的 channel
var (
clientMsg = msg{}
enterRooms = make(chan wsClients)
sMsg = make(chan msg)
offline = make(chan *websocket.Conn)
chNotify = make(chan int ,1)
)
```
- 使用 make 创建一个全局的 `map slice` 用于存放房间与用户的信息,用户上线、离线实际上是对map的 append 跟 remove
```go
var (
rooms = make(map[int][]wsClients)
)
```
- 开启`goroutine`处理用户的连接、离线、消息发送等各个事件
```go
go read(c)
go write()
select {}
```
## database
#### mysql
```
CREATE TABLE `messages` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '用户ID',
`room_id` int(11) NOT NULL COMMENT '房间ID',
`to_user_id` int(11) NULL DEFAULT 0 COMMENT '私聊用户ID',
`content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '聊天内容',
`image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '图片URL',
`created_at` datetime(0) NULL DEFAULT NULL,
`updated_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
`deleted_at` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_user_id`(`user_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
CREATE TABLE `users` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '昵称',
`password` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码',
`avatar_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '头像ID',
`created_at` datetime(0) NULL DEFAULT NULL,
`updated_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
`deleted_at` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
```
### nginx 部署
server {
listen 80;
listen 443 ssl http2;
server_name go-gin-chat.hzz.cool;
#ssl on;
ssl_certificate xxxpath\cert.pem;
ssl_certificate_key xxxpath\key.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location ~ .*\.(gif|jpg|png|css|js)(.*) {
proxy_pass http://127.0.0.1:8322;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_cache_valid 200 302 24h;
proxy_cache_valid 301 30d;
proxy_cache_valid any 5m;
expires 90d;
add_header wall "Big brother is watching you";
}
location / {
try_files /_not_exists_ @backend;
}
location @backend {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8322;
}
location /ws {
proxy_pass http://127.0.0.1:8322;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 6000s;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Golang(Gin框架)+websocket 实现的多人聊天室+代码+详细文档 (131个子文件)
config 308B
emojionearea.min.css 22KB
style.css 7KB
rolling.css 4KB
description 73B
config.go.env 723B
exclude 240B
.gitattributes 82B
.gitignore 77B
serve.go 11KB
serve.go 8KB
IndexController.go 3KB
imgFreeImage.go 2KB
message.go 2KB
session.go 2KB
user.go 2KB
route.go 1KB
user.go 1KB
main.go 1KB
mock_ws_client_coon.go 976B
ImageController.go 961B
exec.go 845B
helper.go 739B
start.go 635B
temp_global_var.go 511B
mysql.go 335B
img_factory.go 326B
message.go 317B
time_task.go 281B
safe.go 245B
validator.go 198B
ServeInterface.go 181B
img_upload_interface.go 93B
static_global_val.go 74B
HEAD 191B
HEAD 191B
HEAD 32B
HEAD 23B
room.html 11KB
private_chat.html 5KB
login.html 4KB
index.html 2KB
favicon.ico 827B
pack-96803a679dbfb69edaef123d9bb2b887574ff49f.idx 23KB
index 10KB
6_bg.jpg 286KB
11_bg.jpg 278KB
6_mh.jpg 214KB
9_bg.jpg 208KB
9_mh.jpg 193KB
12_bg.jpg 189KB
2_mh.jpg 176KB
5_mh.jpg 163KB
11_mh.jpg 160KB
8_mh.jpg 139KB
1_mh.jpg 136KB
3_mh.jpg 134KB
4_mh.jpg 128KB
1_bg.jpg 127KB
8_bg.jpg 119KB
12_mh.jpg 118KB
7_mh.jpg 118KB
10_mh.jpg 114KB
5_bg.jpg 107KB
2_bg.jpg 86KB
3_bg.jpg 84KB
4_bg.jpg 76KB
login_bg.jpg 64KB
10_bg.jpg 54KB
7_bg.jpg 38KB
6_xs.jpg 5KB
6.jpg 5KB
3.jpg 4KB
5.jpg 4KB
4.jpg 4KB
2.jpg 4KB
2_xs.jpg 4KB
1.jpg 4KB
9_xs.jpg 4KB
11_xs.jpg 3KB
5_xs.jpg 3KB
8_xs.jpg 3KB
3_xs.jpg 3KB
1_xs.jpg 3KB
12_xs.jpg 3KB
10_xs.jpg 2KB
4_xs.jpg 2KB
7_xs.jpg 2KB
emojionearea.min.js 52KB
rolling.js 32KB
Public.js 14KB
websocket-heartbeat.js 3KB
load-msg-more.js 2KB
master 191B
master 41B
readme.md 6KB
go.mod 3KB
pack-96803a679dbfb69edaef123d9bb2b887574ff49f.pack 11.22MB
packed-refs 237B
12.png 11KB
共 131 条
- 1
- 2
资源评论
烦啊
- 粉丝: 207
- 资源: 87
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功