Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

No packages published

AltStyle によって変換されたページ (->オリジナル) /