[TOC]
## go-chat
使用Go基于WebSocket的通讯聊天软件。
### 功能列表:
* 登录注册
* 修改头像
* 群聊天
* 群好友列表
* 单人聊天
* 添加好友
* 添加群组
* 文本消息
* 剪切板图片
* 图片消息
* 文件发送
* 语音消息
* 视频消息
* 屏幕共享(基于图片)
* 视频通话(基于WebRTC的p2p视频通话)
* 分布式部署(通过kafka全局消息队列,统一消息传递,可以水平扩展系统)
## 后端
[代码仓库](https://github.com/kone-net/go-chat)
go中协程是非常轻量级的。在每个client接入的时候,为每一个client开启一个协程,能够在单机实现更大的并发。同时go的channel,可以非常完美的解耦client接入和消息的转发等操作。
通过go-chat,可以掌握channel的和Select的配合使用,ORM框架的使用,web框架Gin的使用,配置管理,日志操作,还包括proto buffer协议的使用,等一些列项目中常用的技术。
### 后端技术和框架
* web框架Gin
* 长连接WebSocket
* 日志框架Uber的zap
* 配置管理viper
* ORM框架gorm
* 通讯协议Google的proto buffer
* makefile 的编写
* 数据库MySQL
* 图片文件二进制操作
## 前端
基于react,UI和基本组件是使用ant design。可以很方便搭建前端界面。
界面选择单页框架可以更加方便写聊天界面,比如像消息提醒,可以在一个界面接受到消息进行提醒,不会因为换页面或者查看其他内容影响消息接受。
[前端代码仓库](https://github.com/kone-net/go-chat-web):
https://github.com/kone-net/go-chat-web
### 前端技术和框架
* React
* Redux状态管理
* AntDesign
* proto buffer的使用
* WebSocket
* 剪切板的文件读取和操作
* 聊天框发送文字显示底部
* FileReader对文件操作
* ArrayBuffer,Blob,Uint8Array之间的转换
* 获取摄像头视频(mediaDevices)
* 获取麦克风音频(Recorder)
* 获取屏幕共享(mediaDevices)
* WebRTC的p2p视频通话
### 截图
* 语音,文字,图片,视频消息
![go-chat-panel](/assets/screenshot/go-chat-panel.jpeg)
* 视频通话
![video-chat](/assets/screenshot/video-chat.png)
* 屏幕共享
![screen-share](/assets/screenshot/screen-share.png)
## 消息协议
### protocol buffer协议
```go
syntax = "proto3";
package protocol;
message Message {
string avatar = 1; //头像
string fromUsername = 2; // 发送消息用户的用户名
string from = 3; // 发送消息用户uuid
string to = 4; // 发送给对端用户的uuid
string content = 5; // 文本消息内容
int32 contentType = 6; // 消息内容类型:1.文字 2.普通文件 3.图片 4.音频 5.视频 6.语音聊天 7.视频聊天
string type = 7; // 如果是心跳消息,该内容为heatbeat
int32 messageType = 8; // 消息类型,1.单聊 2.群聊
string url = 9; // 图片,视频,语音的路径
string fileSuffix = 10; // 文件后缀,如果通过二进制头不能解析文件后缀,使用该后缀
bytes file = 11; // 如果是图片,文件,视频等的二进制
}
```
### 选择协议原因
通过消息体能看出,消息大部分都是字符串或者整型类型。通过json就可以进行传输。那为什么要选择google的protocol buffer进行传输呢?
* 一方面传输快
是因为protobuf序列化后的大小是json的10分之一,是xml格式的20分之一,但是性能却是它们的5~100倍.
* 另一方面支持二进制
当我们看到消息体最后一个字段,是定义的bytes,二进制类型。
我们在传输图片,文件,视频等内容的时候,可以将文件直接通过socket消息进行传输。
当然我们也可以将文件先通过http接口上传后,然后返回路径,再通过socket消息进行传输。但是这样只能实现固定大小文件的传输,如果我们是语音电话,或者视频电话的时候,就不能传输流。
## 快速运行
### 运行go程序
go环境的基本配置
...
拉取后端代码
```shell
git clone https://github.com/kone-net/go-chat
```
进入目录
```shell
cd go-chat
```
拉取程序所需依赖
```shell
go mod download
```
MySQL创建数据库
```mysql
CREATE DATABASE chat;
```
修改数据库配置文件
```shell
vim config.toml
[mysql]
host = "127.0.0.1"
name = "chat"
password = "root1234"
port = 3306
table_prefix = ""
user = "root"
修改用户名user,密码password等信息。
```
创建表
```shell
将chat.sql里面的sql语句复制到控制台创建对应的表。
```
在user表里面添加初始化用户
```shell
手动添加用户。
```
运行程序
```shell
go run cmd/main.go
```
### 运行前端代码
配置React基本环境,比如nodejs
...
拉取代码
```shell
git clone https://github.com/kone-net/go-chat-web
```
进入目录
```shell
cd go-chat-web
```
安装前端基本依赖
```shell
npm install
```
如果后端地址或者端口号需要修改
放在服务器运行时一定需要修改后端地址
```shell
修改src/chat/common/param/Params.jsx里面的IP_PORT
```
运行前端代码默认启动端口是3000
```shell
npm start
```
访问前端入口
```
http://127.0.0.1:3000/login
```
### 分布式部署
* 拉取代码
将代码拉取到服务器,运行make build构建后端代码。
* 构建后端服务镜像
进入目录deployments/docker
通过目录下的Dockerfile构建镜像
```
docker build -t konenet/gochat:1.0 .
```
* 部署服务
需要部署nginx进行反向代理,mysql保存数据,1个或者多个后端服务。
* 在config.toml中配置分布式消息队列
将msgChannelType中的channelType修改为kafka,就为分布式消息队列。需要填写消息队列对应的地址和topic
```toml
appName = "chat_room"
[mysql]
host = "mysql8"
name = "go-chat-message"
password = "thepswdforroot"
port = 3306
tablePrefix = ""
user = "root"
[log]
level = "debug"
path = "logs/chat.log"
[staticPath]
filePath = "web/static/file/"
[msgChannelType]
channelType = "kafka"
kafkaHosts = "kafka:9092"
kafkaTopic = "go-chat-message"
```
* 启动服务
通过deployments/docker下的docker-compose.yml进行启动。
```
docker-compose up -d
```
* 注意:分布式部署后,上传的文件视频等,可能会因为负载到不同的机器上,导致文件找不到的情况,所以需要一个在线或者分布式文件服务器。
## 代码结构
```
├── Makefile 代码编译,打包,结构化等操作
├── README.md
├── api controller类,对外的接口,如添加好友,查找好友等。所有http请求的入口
│ └── v1
├── assets
│ └── screenshot 系统使用到的资源,markdown用到的截图文件
├── bin 打包的二进制文件
├── chat.sql 整个项目的SQL
├── cmd
│ └── main.go main函数入口,程序启动
├── config
│ └── toml_config.go 系统全局的配置文件配置类
├── config.toml 配置文件
├── deployments
│ └── docker docker构建镜像,docker-compose.yml等文件
├── go.mod
├── go.sum
├── internal
│ ├── dao 数据库
│ ├── kafka kafka消费者和生产者
│ ├── model 数据库模型,和表一一对应
│ ├── router gin和controller类进行绑定
│ ├── server WebSocket中消息的接受和转发的主要逻辑
│ └── service 调用的服务类
├── logs
├── pkg
│ ├── common 常量,工具类
│ ├── errors 封装的异常类
│ ├── global 封装的日志类,使用时不会出现第三方的包依赖
│ └── protocol protoc buffer自动生成的文件,定义的prot
没有合适的资源?快使用搜索试试~ 我知道了~
使用Go基于WebSocket开发的web聊天应用。单聊,群聊。文字,图片,语音,视频消息,屏幕共享,剪切板图片
共49个文件
go:33个
md:2个
png:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 102 浏览量
2023-12-24
15:34:14
上传
评论
收藏 2.74MB ZIP 举报
温馨提示
go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目 go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目 go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目 go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目 go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目 go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目 go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目 go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目 go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目 go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目 go语言开发项目go语言开发项目go语言开发项目go语言开发项目go语言开发项目
资源推荐
资源详情
资源评论
收起资源包目录
go-chat.使用Go基于WebSocket开发的web聊天应用。单聊,群聊。文字,图片,语音,视频消息,屏幕共享,剪切板图片,基于WebRTC的P2P语音通话,视频聊天。.zip (49个子文件)
go-chat-main
go.mod 897B
go.sum 76KB
assets
screenshot
video-chat.png 1.55MB
screen-share.png 1.1MB
go-chat-panel.jpeg 161KB
config.toml 320B
Makefile 1KB
api
v1
group_controller.go 1KB
file_controller.go 1KB
message_controller.go 746B
user_controller.go 2KB
web
static
file
.gitkeep 0B
cmd
main.go 1KB
internal
dao
pool
mysql_tool.go 2KB
service
group_service.go 2KB
message_service.go 3KB
user_service.go 4KB
model
group_member.go 643B
user_friend.go 474B
group.go 688B
user.go 964B
message.go 1KB
router
router.go 2KB
socket.go 664B
server
server.go 5KB
client.go 1KB
kafka
consumer.go 1KB
producer.go 892B
ss.md 37B
chat.sql 4KB
pkg
protocol
message.proto 917B
message.pb.go 5KB
global
log
logger.go 2KB
errors
error.go 161B
common
constant
constant.go 381B
response
message_response.go 618B
group_response.go 247B
search_response.go 151B
response_msg.go 512B
request
friend_request.go 93B
message_request.go 176B
util
file_suffix.go 6KB
deployments
docker
docker-compose.yml 2KB
Dockerfile 270B
nginx.conf 1KB
test
kafka_test.go 1KB
.gitignore 244B
README.md 18KB
config
toml_config.go 1KB
共 49 条
- 1
资源评论
天天501
- 粉丝: 622
- 资源: 5905
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 水果系统.rar
- 企业级新闻系统(SSH+MYSQL)130221.rar
- 图片浏览小程序(java+applet)130227.rar
- 通用的在线考试系统(jsp+struts+hibernate+oracle)130220.rar
- 微信文章爬虫项目全套技术资料100%好用.zip
- 单机无穷大系统发生各类(三相短路,单相接地,两相接地,两相相间短路)等短路故障,各类(单相断线,两相断线,三相断线)等断线故障,暂态稳定仿真分析
- 图书管理系统(struts+hibernate+spring).rar
- 图书管理系统(struts+hibernate+spring)130225.rar
- 图书管理系统(struts+hibernate+spring+ext).rar
- 网上订餐系统(struts+spring+hibernate).rar
- 网上订餐系统(struts+spring+hibernate)130221.rar
- 图书管理系统(struts+hibernate+spring+ext)130221.rar
- 网上商城系统(JSP+MYSQL)130220.rar
- 网上商城系统(JSP+MYSQL).rar
- 网上购物系统(JavaBean+Servlet+jsp)130223.rar
- 网上书城系统(Struts+Hibernate+Mysql)130222.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功