Skip to content

ydszza/chatroom

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ChatRoom

基于 Linux Socket 的多人聊天室

简介:
仿照QQ,实现简单的即时通讯软件,包含功能:注册/登录、昵称、群聊/私聊。
基于 C/S 模型

  • Client使用 QT 实现
  • Server采用Linux下 Epoll反应堆 + 线程池 实现

使用

//使用端口 
	12345
//编译
	make
//运行
	./server

特点:

  • 较之其他版本,不仅实现基本收发功能,还实现了图形化界面在线列表/昵称 功能
  • 双端采用统一的通信格式,对收发消息进行 指定长度 的读取,避免 Tcp粘包 问题
  • Client 使用一个连接,以统一的 消息收发管理机制,根据消息的分类通过 信号与槽 分发至不同的模块
  • Server 使用 多路I/O复用,避免 连接-进程/线程的一比一 创建,消耗系统资源
  • Server 使用 线程池,避免线程 创建/销毁 的冗余操作
  • Server 不定期对Client连接进行检查,关闭不活跃的连接,减轻Server压力
  • Server 使用 sqlite 进行用户信息的存储

流程:

  • Client:
注册-->连接-->验证注册-->等待结果-->提示结果-->断开连接-->跳转至登录  

登录-->连接-->等待结果-->成功-->加载在线列表-->聊天  
		     |  
                     -->失败-->提示结果-->断开连接
  • Server:
启动线程池/任务队列-->初始化在线列表-->初始化epoll-->初始化监听-->添加监听至epoll-
-->等待事件-->添加accpet任务-->添加epoll监听(等待接收)
    |
    |--->添加recv任务-->注册-->验证-->回复结果-->取消监听/关闭连接
    |		    |
    |               |--->登录-->验证-->回复结果-->验证成功-->添加至在线列表
    |		    |	                      |
    |  	  	    |	                      -->验证失败-->取消监听/关闭连接
    |		    |						
    |               |--->修改个人信息-->修改-->回复结果
    |		    |
    |               --->转发消息-->查找-->转发
    |
    --->添加send任务-->发送消息

食用指南:

  • 了解 Linux多线程 及 线程间通信
  • 了解 Linux网络编程
  • 了解 线程池 基本原理
  • 了解 epoll反应堆模型 基本原理
  • 了解 数据库基本原理 及 常用SQL语句
  • 了解 Sqlite 的C语言编程接口
  • 了解 常用 QT控件 使用
  • 了解 常用 Makefile 编写

优化

  • 完善 错误处理 及 非法数据处理
  • 优化 Server 的 消息转发,如减少字符串拷贝的使用
  • 优化 Client 的 UI设计
  • 优化 在线列表 的数据结构,使用 排序二叉树 提升在线成员查询速率,考虑排序二叉树的退化,可采用更复杂的红黑树实现
  • 优化 epoll 关联的 泛型参数 的数据结构
  • 优化程序设计,从上到下设计,主干扩展分支

bug:

  • Client消息接收 依次延迟 一条消息:
    在 ubuntu16.04 / QT5.5.1环境下,同时打开多个客户端,,原因暂未发现(随机发生)
  • 中文 乱码 问题:
    由于双端对数据的收发为进行 网络字节序 处理,直接粗暴的使用 结构体/数组 解析 数据,因此仅支持英文字符
  • Server 先关闭,会导致下次监听失败:
    在 Server 先关闭时,虽然 Client 有关闭连接代码,但重启 Server 后依旧监听出错,需要多次关闭 Client 或 等待,原因待继续深入研究 Socket

状态:

  • 未完,待续...

About

learn linux socket and qt

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors