Linux环境基于GTK+的图形聊天软件设计 php
cnyinlinux 2016/02 西安 linux
目 录 数据库
1.GTK+介绍 编程
2.C/S聊天程序网络模型 服务器
3.聊天图形界面设计 网络
本人业余时间玩儿了下GTK+,简单总结下写成这篇博客,若是有浅薄疏漏之处,请指正! 数据结构
1.GTK+介绍 多线程
GTK+是Unix/Linux家族最大的开源图形库之一。名字中有个加号,它表明了面向对象特性和可扩展性。知名的gnome桌面环境就是它的表明做(RHEL7或者CentOS7的默认窗体)。 并发
官方网站:http://www.gtk.org/ 负载均衡
因为Linux图形编程并非很普遍,因此流传的中文资料尤为稀缺。所需文档都来自其官网(英文)。
本文基于GTK+ 3.0成文。
1-1.GTK+体系
以下图所示,GTK+并非一个软件包,而是一个体系库,它包含了多个组件。
目前GTK+已经支持多种高级语言,包括C/C++,Python等。
用一句话归纳下每一个组件的做用:
Cairo是支持多种设备输出的2D图像显示库;
GLib是C语言的底层库,提升数据结构定义和接口包装;
Pango是显示布局和字体渲染的库;
ATK是底层接口的集合库;
GDK是窗体和图形系统的底层函数库;
GIO是Glib的Input, Output and Streaming Library;
GTK+就是最终的图形库了,它提供最直接的图形元素接口(内部会调用到其余模块功能)。
1-2.GTK+库的使用
须要在操做系统上安装该库。红帽系的Linux都将其作入到了yum仓库里。
Debian系列的APT源也支持在线安装。若是想要本身下载离线包安装的话,请参考下面连接:http://www.gtk.org/download/index.php
1-3.GTK+编程
图形库已经安装好了,如今就是调用其组件实现图形编程了。
它是面向对象的图形编程模式,于是须要有OOP的图形设计思想。在咱们的高级语言程序中调用GTK+接口,而后编译时给GCC导入连接选项,即命令 pkg-config --libs --cflags gtk+-3.0 的执行结果。如:
----------------------------------------------------------------------
gcc test_gtk.c $(pkg-config --libs --cflags gtk+-3.0)
----------------------------------------------------------------------
其接口手册连接为:https://developer.gnome.org/gtk3/3.18/
PS:海量API。。。
2.C/S聊天程序网络模型
2-0.闲话
本文着重描述GTK+图形编程的乐趣,因此聊天内容的网络程序并未考虑某讯那样数以亿计的用户量并发问题。服务端也没有集群化负载均衡。也没使用数据库使用户信息持久化。
也没有支持拖动传送文件功能(Linux下SSH可替代)。客户端以IP为标识进行聊天。
2-1.采用UDP协议,文本聊天内容可靠性要求不高,面向无链接节省资源,减少服务器压力,支持更多客户连接。
2-2.群聊功能
只支持大群聊(即全部客户端在一个群中),后面有空了再支持用户自定义群聊(即建群功能)。因此服务端采用单进程多线程。按功能划分为文本接收线程,和群转发线程。暂时不支持海量文本信息同时到达时的并发处理,由于考虑到用户的聊天是手动输入,其速度远低于CPU速度,因此这种及其高压的场景不存在。
2-3.重大缺陷
除了说的不支持建群外,最显著的就是没有考虑CC攻击。若恶意程序蓄意攻击形成高并发的话,服务器会卡顿,甚至转发严重延迟。
能够考虑从两个方面去解决,一是从程序逻辑自己着手,增强对文本内容或请求的甄别从而识别恶意客户端。二是经过防火墙策略,监视客户端数据传输速率,超过人类聊天的可达速度太多就可判断为恶意攻击。
2-4.私聊功能
私聊比较交单,若是客户端是私聊的话直接P2P就能够了。目前是经过IP来标识客户端,因此能够直接连通。
若是采用昵称或者ID来标识的话,则需先由服务器来进行客户端信息认证。而后客户端获知对方IP后链接。
也能够采用服务端转发的方式,我的以为这样会耗费服务器资源。
固然,若是要保存聊天信息的话,也须要向服务器发送每一条记录。
3.聊天图形界面设计
我们如今来讲说界面设计。
3-1.启动窗体
启动程序以后先进用户认证,会弹出用户名和密码输入窗体。
本程序没有经过服务端认证(服务器没有保存用户信息),因此设计上考虑可扩展性,于是设计了这个认证状体,实际上点击login的时候进行的是本地认证(客户端本身记着一个合法的用户名和密码)。
经过下面代码来讲明吧:
------------------------------------------------------------------------------------------------------------
GtkWidget *window
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);//生成窗体
gtk_widget_set_size_request(window,450,380); //设置窗体大小
gtk_window_set_title(GTK_WINDOW(window),"glogin");//设置窗体标题
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);//窗体启动时位置
gtk_window_set_resizable(GTK_WINDOW(window),FALSE);//窗体是否可缩放
g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);//点击X触发窗体销毁
------------------------------------------------------------------------------------------------------------
有了窗体还得有按钮啊,按钮还得布局啊,点击后有触发事件啊。。。等等,
这些就要用到fixed,button,以及label了。这里就不一一说明了,请读者参考官网接口说明书。
#本窗体设计的代码量为250L。
3-2.在登录成功之后,就自动销毁登录窗体,生存新窗体,就是聊天界面了。
这个窗体就复杂多了,除了按钮,还有文本框,并且支持滚动条。
#本窗体设计代码量为1000L。
群聊与私聊功能的切换经过图中的【Public】按钮实现。可重复点击,在群里与私聊之间转换。在聊天中不可切换,需断开当前聊天模式才能点击按钮,不然灰色状态不可触发。
Linux下图形编程库还有QT,显得华丽,smplayer就是它的产品。还有curses字符图形库。请感兴趣的读者本身学习完善吧。