Skip to content

Modnars/ModServer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ModServer

        致力于实现一个聊天管理的服务器,快来与 Modnar 一起学习吧!

运行结果

运行说明

        目前所有用户发送的消息均被发送到服务器端,且不同用户间消息互不可见(当然,后续可以实现真正的聊天,思路与逻辑比较清晰)。同时,服务器端可将用户发送来的特定的字符串作为命令来看待,比如history就是一个查询该用户历史发送消息的命令。

        考虑到后续会致力于实现一个真正的“聊天室”,这里不展开叙述当前实现内容,具体内容可参考代码及下面的说明。

        关于实现一个聊天室来说,有以下几个问题需要考虑:

  • 服务器端如何记录历史消息?

可以申请一块内存空间单独用于存储历史消息,对于这块空间的访问,可以采用高级IO来进行操作以提升效率。但缺点在于每个用户发送来消息时,均需要对该部分内容进行维护。

  • 客户端如何实时获得其他用户发送的消息?

这里可能需要对客户端进行一个改造,即修改当前仅有的发送、接收轮次执行为监听接收,当有新消息时就进行接收并显示,这部分内容依旧可以考虑采用IO复用来实现(暂未实施,思路如此)。同时,在服务器端就需要接收到一个用户的消息后,对其他的所有连接用户均发送一份“信息的拷贝”。

程序截图(当前已实现部分)

        服务器端,会针对用户传来的消息以及用户的状态进行识别,这里采用终端下颜色显示以区分不同类型消息。

服务器端

        客户端1,主要测试了历史消息存储(只存储该用户自己的最近10条消息),当然,存储多少条可以进行设置,这里仅用于调试与展示。

客户端1

        客户端2,用于测试并发效果,且其中包含中文内容,可以看到服务器端依旧可以正常处理(当然,存储单个中文汉字需要三个字节,这在服务器端执行结果可以看到)。

客户端2

日志

2020/04/01

        回顾了关于网络的一些基础知识,并学习了一些socket通信函数。

2020/04/02

        学习参考书上的示例,复现了该实现代码,包括TCP数据传输、以及外带数据传输(待完善)。

2020/04/03

        读完了《Linux高性能服务器编程》,将重心放在 chatServer 的实现,并开始尝试。

2020/04/04

        针对书中的一些内容,重点阅读并深入理解了一下,对于macOS下无法使用epoll进行I/O复用的问题,采取kqueue来进行实现。

2020/04/05

        调试程序,查阅关于kqueueEV_SETkevent等内容的博客经验,修改程序中的Bug:

  • 文件描述符阻塞问题(在写码时忽略了将文件属性设置为O_NONBLOCK),使得I/O复用表现异常。

  • 共享内存问题(由于一次程序非法退出,使得创建的一块共享内存未被回收,进而造成后续程序无法运行。通过在程序中先调用shm_unlink解决)。

  • 关于kqueue的使用问题,现已实现基础功能。

        截止至2020.4.5 23:00,已修改实现思路,完全采用IO复用来实现对多个连接进行管理,已实现基本功能,关于使用到的IO复用,可点击此处以查看

2020/04/06

        截止至2020.04.05 11:45,完成预期功能: 查询历史消息。

2020/04/07

        对于服务器端的缓冲区进行优化,采用共享内存来进行存储。这样的实现的优势在于可以使得多个进程共同访问,这对于多个进程(比如多个服务器进程)来说,会极大地优化内存空间(当然,对于这块内存的读写要注意并发互斥以保证数据安全)。

        此外,关于共享内存申请、分配、映射,请参阅源代码(chatServer)中关于这部分的说明,这也是需要注意的一个点(之前在这里踩过坑)。

        关于用户数据存储、历史消息存储等内容,后续会专门分享我的解决方案以及针对不同场景的一些设计思路,敬请期待!

其他

        这是一个不错的练手项目,当然,其中改进的地方依然有很多。比如考虑到团队项目协作,即可通过制定协议来约束更多字段的表示与使用。后续考虑更新项目的更健壮版本。

        关于更换电脑后,如何同步原电脑和新电脑的Git(二者需要两个不同Git.username和Git.email),如果有读者有相关经验,请不吝赐教。

About

关于Linux网络编程的学习与实践

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published