# MyChatServer **Repository Path**: linux-gitee/my-chat-server ## Basic Information - **Project Name**: MyChatServer - **Description**: 基于muduo网络库和第三方json库开发,并使用了nginx作为负载均衡器以及使用了Redis实现消息队列,供多个服务器跨服务器进行通信。 聊天室功能有注册或登录用户、点对点聊天、创建群组、群组聊天等 - **Primary Language**: Unknown - **License**: AFL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-12-22 - **Last Updated**: 2024-12-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MyChatServer ## 介绍 这是一个在大三暑假做的集群式聊天服务器,基于muduo网络库和第三方json库开发,并使用了nginx作为负载均衡器以及使用了Redis实现消息队列,供多个服务器跨服务器进行通信。 聊天室功能有注册或登录用户、点对点聊天、创建群组、群组聊天等 ## 编译方法 直接在目录下运行`autobuild.sh`脚本即可完成编译,编译后的可执行程序在`/bin`目录下 ## 数据库创建 ``` mysql create database chat; use chat; # 群组表-存放群组的信息 CREATE TABLE `allgroup` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '群组id', `groupname` varchar(50) NOT NULL COMMENT '群组名称', `groupdesc` varchar(200) DEFAULT '' COMMENT '群组功能描述', PRIMARY KEY (`id`), UNIQUE KEY `groupname` (`groupname`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=gbk; # 好友列表,点对点的关系 CREATE TABLE `friend` ( `userid` int NOT NULL COMMENT '用户id', `friendid` int NOT NULL COMMENT '好友id', PRIMARY KEY (`userid`,`friendid`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk; # 群组成员列表,存放每个群中的成员有谁 CREATE TABLE `groupuser` ( `groupid` int NOT NULL COMMENT '群组id', `userid` int NOT NULL COMMENT '组员id', `grouprole` enum('creator','normal') DEFAULT 'normal' COMMENT '组内角色', PRIMARY KEY (`groupid`,`userid`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk; # 离线信息表,在目标用户上线时将消息推送给它,并且在表中移除该消息 CREATE TABLE `offlinemessage` ( `userid` int NOT NULL COMMENT '用户id', `message` varchar(500) NOT NULL COMMENT '离线信息(存储Json字符串)' ) ENGINE=InnoDB DEFAULT CHARSET=gbk; # 用户表,使用SHA256加盐哈希存放,所以为了验证密码需要保存盐值 CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '用户id', `name` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(100) NOT NULL COMMENT '用户密码', `salt` varchar(100) default 'null' COMMENT '盐值', `state` enum('online','offline') DEFAULT 'offline' COMMENT '当前登录状态', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=gbk; ``` ## 集群时Nginx的配置示例 ``` nginx # nginx tcp loadbalance config stream { upstream ChatServer{ server 127.0.0.1:6970 weight=1 max_fails=3 fail_timeout=3s; server 127.0.0.1:6971 weight=1 max_fails=3 fail_timeout=3s; } server{ proxy_connect_timeout 1s; #proxy_timeout 3s; listen 6969; proxy_pass ChatServer; tcp_nodelay on; } } ``` ## kafka kafka需要创建一个初始化topic --> maintopic 来作为kafka初始化的话题,我自己用到的操作示例如下 ``` markdown ######kafka##### # 创建话题maintopic bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --topic maintopic --partitions 3 bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --topic maintopic --partitions 3 #查看topic bin/kafka-topics.sh --bootstrap-server localhost:9092 --list #删除topic bin/kafka-topics.sh --delete --bootstrap-server localhost:9092 --topic testtopic bin/kafka-topics.sh --delete --bootstrap-server localhost:9092 --topic newtopic # 创建生产者 bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic testtopic #创建消费者 bin/kafka-console-consumer.sh --from-beginning --topic testtopic --bootstrap-server localhost:9092 ``` # Protobuf版本 项目除了Json自定义协议之外,还开发了Protobuf版本,如要浏览可切换到[Protobuf](https://gitee.com/SakuraPub/my-chat-server/tree/master/)分支