基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件

大二写的项目
大致功能入下

1.登录
2.注册
3.忘记密码
4.私聊
5.同时多发发送大文件并且能聊天
6.语音消息
7.语音通话
8.群聊
9.离线语音消息 私聊消息 群聊消息

							**项目功能概览**

一登录界面
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第1张图片
二、注册窗口
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第2张图片
三、忘记密码窗口
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第3张图片
五、登录成功界面
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第4张图片

登录新用户自动刷新在线状态 发消息功能
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第5张图片

语音消息
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第6张图片
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第7张图片

语音通话功能
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第8张图片
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第9张图片
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第10张图片

发送文件模块
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第11张图片
基于Linux C GTK使用epoll+TCP/UDP实现及时通讯软件_第12张图片

功能待更新

										****项目总结****

1.服务器架构选择
为什么选择epoll(I/O多路复用结构)
1.循环服务器,处理并发的效率太低,而且对于高并发的连接响应较慢,优点:处理客户端的事件效率较高。
2.select、poll 可以同时观察许多流的IO事件,但是当监听的IO有读或写,只能重头遍历才知道是哪个IO有对应的事件,并且select通过数组来管理监听的IO文件描述符,灵活性受限,而poll借助内核链表来事件,导致有IO事件时,需要多次访问内核到上下文的切换来找到对应IO,从而开销太大。

epoll可以理解为event poll 不同于忙轮询和无差别轮询, epoll会把那个流发生怎样的IO事件通知。处理的时间复杂到位O(1);
并且将维护等待队列与阻塞进程分开,从而效率更高。

2.是不是用了epoll就不需要多线程呢
并不是的,epoll的优势是能在极短时间去响应一个短连接的事件,所以当你在做类似与发送文件,发送视频,语言通话等,使用多线程会效率更快。所以epoll的优势在于很多客户端同时发起连接,其处理的速度,而不是在于处理连接好的各个客户端的事物上

3.选用GTK
写项目一定要注重对于个人的体验感,在linux下的适用于C语言的图形库,现在主流是GTK 还有ncurses等。界面肯定会让你的项目更具活力。本项目主要运用到GTK 的entry、button 、process、link_button、window、scroall_window、image、text_view、list、menu等。

4.个人认为项目出彩的功能等
1.对于简单登录注册等,都不存在技术难题。发送消息群聊等。
文件发送模块

1.如何在边发送文件边发送消息等其他功能
这个想法涉及到并发实现、所以本能反应使用多线程 OR 多进程 本项目中,启用单独的进程去完成发送文件。这个想法也类似于现在的微服务,单独启用单独一条TCP通道去完成文件发送。发消息与发送文件互不干扰。只需要在退出时候做进程间通信即可

2.为什么选用进程而不是线程。
这又涉及到多线程与多进程的区别了。而本项目最主要的原因是采用微服务实现,若采用多线程,当一个模块出现错误时候,整个服务器都将崩溃,这是不能接受的。而多进程是享有独立的地址空间,就不会被影响到。
而我之前是选用的多线程去发送文件,每次发送文件启用单独的线程去发送,但是只能同时发送一个文件。及服务器只能单独收一个或者发一个。虽然每次发送文件都启用新的TCP连接到服务器(及新的通道)。于是选用多进程。

3.文件存后在发还是边发边存。
对于这个,现在市面上很多软件都采用二者之一,但是现在大多数选用可以离线下载模式,于是选择了服务器备份后再发送。

语音模块
1.语音消息。
语音消息也类似文件发送。使用alsa库打开混杂设备。设置为录音模式,将录音写入到文件中。发送。设置PCM。为放音模式,然后读入文件写入设备。(设置设备一共8步)

2.语音通话。
采用单独的UDP协议去语音通话。同样采用单独起一个进程去进行通话。同样将上述的操作改变一下,通过udp发送从声卡设备读到的数据。但是这个过程有线程同步的机制,及recvfrom的数据应该与写入声卡的数据保持同步。一共涉及4个线程(一个客户端的通话模块(进程)) 发送、接收、从声卡读、往声卡写。
虽然思路很简单但是对于功能来说是十分繁琐的。如你在拨打电话时候,对方拒接听、你停止拨打。以及接听后那方先挂断等等繁琐的情况。

最终总结
本项目几乎涵盖了整个C语言的系统编程的知识,使用了UDP tcp IO多路复用服务器模型,循环服务器模型、多线程同步与互斥、多进程、进程间通信。巩固了系统编程的知识点。更多的是学习到的东西。
1.将各个功能模块细化更细化
2.代码结构很重要 软件设计模式会让你少写很多冗余的代码
3.微服务思想。将模块独立化。互补干扰,将服务器的健壮性大大增加(不足之处在于进程间通信繁琐)
4.学习到了新的界面库GTK
5.作为课程设计的项目,还是有很多不足。吸取从中得到的经验。

你可能感兴趣的:(学习)