Skip to content

adairxie/chat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

68 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

系统描述

使用C++实现, 运行在Linux下, 依赖mysqlclient库, 消息的编解码使用protobuf。
客户端与服务器的通信采用TCP长连接。 服务器采用多线程异步模型,主线程接收新连接,
子线程通过事件循环处理网络IO。新建TcpConnection时从event loop pool里挑选一个
loop给TcpConnection用

体系结构

详细说明

使用LVS+Keepalived实现负载均衡, LVS的转发采用直接路由模式。
负载均衡层由两个Director组成,一个master和一个backup。
服务器集群部署两个chat服务器,提供即时通讯的基本功能
数据共享存储层通过mysql和redis存储用户信息、缓存消息记录。

编译

cd ./chat/excercise/chatServer<br>
make

运行服务器

./server_threaded [port] [thread_nums] #启动服务器 port:服务器端口 thread_nums:线程池大小<br>

运行客户端

chatClient 需要在本地存储用户信息,user.info中的用户信息在用户首次注册时生成。<br>
./chatClient [server_addr] [server_port] # server_addr —— 服务器地址 server_port —— 服务器端口

客户端命令

//注册用户
s [user_name] [passwd] 
//登录
l [user_id] [passwd]            # user_id 由服务器返回,并append到user.info
//私聊
p [peer_id] [message...]        # peer_id 好的账号, message表示消息
//创建聊天群
c [group_id]                    # group_id 用户向服务器注册群号,任意用户都可以创建聊天群
//加入聊天群
g [group_id]                    # group_id 群号,任意人都可以加入某一个群,没有权限限制
//退出聊天
q

测试

  1. 客户端:

    1)登录部分测试:
        --------------------------------------------------
                    输入示例        预计输出
        --------------------------------------------------
        id不存在    uid:foo         客户端收到错误提示信息
                    passwd:123
        --------------------------------------------------
        id存在      uid:bar         客户端收到错误提示信息
        密码不正确  passwd:1234
        --------------------------------------------------
        id不存在    uid:panda       客户端收到提示信息
        密码正确    passwd:2427     
        --------------------------------------------------
        id正确      uid:frog        进入聊天
        密码正确    passwd:1357     
        --------------------------------------------------
    2)注册模块测试:
        --------------------------------------------------
                    输入示例        预计输出
        --------------------------------------------------
        注册已经存在 id:foo         提示用户已经存在
        的id
        --------------------------------------------------
        两次密码输  passwd:123      提示密码错误
        入不一致    passwd:321  
        --------------------------------------------------
        有未填写项  id空白或        提示有未输入项
                    passwd空白  
        --------------------------------------------------
  1. 服务端:

    1)注册模块测试:
        ./sign_up localhost port 注册4万个用户,用户信息持久化到mysql用时15s. 用户名是"abcdefgh"的全排列。
    2) 登录模块测试:
        bug1:客户端退出程序前没有主动断开连接,此时服务端还认为用户在线,并且会导致下次用户登录不上系统。
    3)压力测试:
        服务器为4核i7-4790k @ 4GHz服务器
        1000个用户连接,每个用户随机挑选其他用户发"hello world!",测试持续24小时,服务器未出现问题。
        一个用户向另外一个用户发送20万条"hello world", 时间消耗平均是6s, 服务器TPS达到3万/秒。

About

使用C++11实现的一个高性能聊天服务器程序

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published