Linux下基于GTK的C/S聊天软件

Linux环境基于GTK+的图形聊天软件设计

                                                        cnyinlinux  2016/02  西安

 

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图像显示库;

GLibC语言的底层库,提高数据结构定义和接口包装;

Pango是显示布局和字体渲染的库;

ATK是底层接口的集合库;

GDK是窗体和图形系统的底层函数库;

GIOGlibInput, 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+图形编程的乐趣,所以聊天内容的网络程序并未考虑某讯那样数以亿计的用户量并发问题。服务端也没有集群化负载均衡。也没使用数据库使用户信息持久化。

也没有支持拖动传送文件功能(LinuxSSH可替代)。客户端以IP为标识进行聊天。

 

2-1.采用UDP协议,文本聊天内容可靠性要求不高,面向无连接节省资源,减小服务器压力,支持更多客户链接。

 

2-2.群聊功能

只支持大群聊(即所有客户端在一个群中),后面有空了再支持用户自定义群聊(即建群功能)。所以服务端采用单进程多线程。按功能划分为文本接收线程,和群转发线程。暂时不支持海量文本信息同时到达时的并发处理,因为考虑到用户的聊天是手动输入,其速度远低于CPU速度,所以这种及其高压的场景不存在。

 

2-3.重大缺陷

除了说的不支持建群外,最显著的就是没有考虑CC攻击。若恶意程序蓄意攻击造成高并发的话,服务器会卡顿,甚至转发严重延迟。

可以考虑从两个方面去解决,一是从程序逻辑本身着手,加强对文本内容或请求的甄别从而识别恶意客户端。二是通过防火墙策略,监视客户端数据传输速率,超过人类聊天的可达速度太多就可判断为恶意攻击。

 

2-4.私聊功能

私聊比较交单,如果客户端是私聊的话直接P2P就可以了。目前是通过IP来标识客户端,所以可以直接连通。

如果采用昵称或者ID来标识的话,则需先由服务器来进行客户端信息认证。然后客户端获知对方IP后连接。

也可以采用服务端转发的方式,个人觉得这样会耗费服务器资源。

当然,如果要保存聊天信息的话,也需要向服务器发送每一条记录。

 

3.聊天图形界面设计

咱们现在来说说界面设计。

3-1.启动窗体

启动程序之后先进用户认证,会弹出用户名和密码输入窗体。

Linux下基于GTK的C/S聊天软件_第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触发窗体销毁

------------------------------------------------------------------------------------------------------------

有了窗体还得有按钮啊,按钮还得布局啊,点击后有触发事件啊。。。等等,

这些就要用到fixedbutton,以及label了。这里就不一一说明了,请读者参考官网接口说明书。

#本窗体设计的代码量为250L

 

3-2.在登陆成功以后,就自动销毁登陆窗体,生存新窗体,就是聊天界面了。


这个窗体就复杂多了,除了按钮,还有文本框,而且支持滚动条。

#本窗体设计代码量为1000L


群聊与私聊功能的切换通过图中的【Public】按钮实现。可重复点击,在群里与私聊之间转换。在聊天中不可切换,需断开当前聊天模式才能点击按钮,否则灰色状态不可触发。 


Linux下图形编程库还有QT,显得华丽,smplayer就是它的产品。还有curses字符图形库。请感兴趣的读者自己学习完善吧。

 

 


你可能感兴趣的:(linux,聊天,图形,C/S,gtk+)