admin 管理员组文章数量: 1086019
2024年4月14日发(作者:z型钢种类)
维普资讯
第20卷第5期
长沙大学学报
VoI.20 No.5
2 0 0 6年9月
JOURNAl OF CHANGSHA UN~ERSrTY
Sep.2 0 0 6
Linux下用GTK+和MySQL开发基于TCP/IP的
网络聊天室
陈特放,黎丹
(中南大学信息科学与工程学院,湖南长沙410083)
摘要:在Linux平台下采用两种高级环境G'PK+2.0和MySQL设计基于TCP/IP的网络聊天室,利用Linux操作系统的
多线程技术和套接字编程技术.用G'PK+2.0和MySQL开发数据库关键技术,详细说明了系统的通信原理和软件的设计与
实现方法.
关键词:聊天室;GTK+2.O;MySQL;套接字;多线程;TCP/IP
中图分类号:TP393 文献标识码:A 文章编号:1008—4681(2006)09一O054—05
Developing Chatrooms in Network with GTK+and MySQL on Linux
CHEN Tefang,LI Dan
(College 0fInformaiton Science and Engin ̄ri.g,Central South University,Hunan 410083,China)
Abstract:This paper introduces 1℃P/II)一based the chatrooms in network under hte Linux environment wiht two
advanced GTK+2.0 nad MySQL usmg multihtreading technology nad Socket technology in Linux.It refers key tceh-
nologies of developing database in GTK+and MySQL.Its communication principle and sofwtare design nad implement
method are given in the paper at last.
Key words:the chatrooms;GTK+2.0;MySQL;Socket;multithreading;TCP/IP
1引 言
良的聊天室是较理想的平 t-.所以,本文介绍用
Linux+GTK+2.0+MySQL+Socket集成技术来构
网上聊天室是Internet网上的一个有趣应用.
建聊天室的方式和方法.
目前,网上聊天室大都是基于Windows NT或Unix
操作系统,采用CGI或ASP技术编程实现.但CGI
2系统整体框架
编程复杂、效率低,而ASP不稳定、安全性差.在没
2、1服务器端
有经过OS Service Pack处理过使用:¥DATA就可
服务器端(如图1)作为管理平台,对于用户权
以看到ASP的源代码.而GTK+和MySQL可以为
限应有不同的限制.例如分为管理员用户和普通用
用户在Linux环境下开发Client/Server数据库提供
户,管理员登录后可开启服务器,并对用户资料和
极大方便和安全.
聊天记录进行查询、删除和清空、重载等操作.这些
Linux作为一个优秀的网络操作系统,具有成
信息和数据将使用DES算法进行加密后存人后台
本低、性能高、稳定性强和源代码开放等特点,并吸 数据库MySQL,以确保用户的安全和利益.
收了Unix的2o年发展经验,内核精炼而稳定,它 2.2.客户端
的发行版本中集成了大量的网络应用软件,如Web
客户端整体框架如图2所示,其基本功能主要
服务器(Apache)、SQL数据库(MySQL)等,并且还有
包括三个部分,具体内容如下:
强大的开发工具(如GTK+2.0)和套接字编程技术
(1)用户的登录与注册:用户首次进入聊天室
(Socket).将它们集中进行应用,建立廉价、性能优 时需要在客户端注册自己的基本信息,并由服务器
收稿日期:2006—04—30;修回日期:2006—07—03
作者简介:陈特放(1957一),男,湖南涟源人,中南大学信息科学与工程学院教授,博士生导师.研究方向:计算机应
用,电气传动与控制,铁路电力牵引;
黎丹(198o一),男,湖南湘潭人,在读硕士.研究方向:计算机应用,电气传动与控制,铁路电力牵引.
维普资讯
总第73期 陈特放,黎丹:Linux下用GTK+和MySQL开发基于TCP/IP的网络聊天室 55
图1聊天室服务器端整体框架
端将其保存.在下次登录的时候,即可仅通过验证
账号和密码来实现登录,并拥有一定的权限.
(2)用户之间的信息交换:聊天室的主要功能
就是实现用户间的信息交换,即聊天.用户首先选
择自己的聊天对象,是群聊还是私聊,选择完成以
后。还可以选择一些动作和表情符来增加聊天的乐
趣.
(3)用户资料的查看与修改:在聊天的过程中,
用户会遇到感兴趣的或者对其感兴趣的用户,这
时,用户就需要彼此了解基本信息.系统授予用户
一
定的权限,使其可以查看他人基本信息并修改自
己的基本信息.
图2聊天室客户端整体框架
3用MySQL和GTK+开发数据库及其关键
技术
3.1开发的可行性
(1)技术可行性.MySQL[ ]关系数据库作为应
用的后台,支持SQL语言,完全可以胜任数据库的
管理运行.GTK+完成图形界面完全可行.
但是,Linux下数据库开发并没有完美的工具.
首先,MySQL只提供文本形式的操作,管理数据库
只能用SQL语言完成,这给数据库的创建和管理
带来不便;其次,C语言开发数据库比起专用数据
库开发语言来周期长、难度较大;再次,还有在Lin.
I.IX系统应用中文的问题.GTK+本身支持双字
节【3,3]现在一些Linux的发行版本已经支持中文,
所以应用程序的界面显示字符将决定于Linux的
版本.
(2)经济可行性.显而易见,Linux平台下的软
件大部分都具有较好的经济性.取得Linux版本的
MySQL和GTK+所需花费极少,与Windows平台下
开发相比是十分经济的.
(3)操作可行性.由于软件开发结果是图形界
面,所以对于操作员来说很简单.但对于系统管理
来说,由于MySQL操作界面是文本形式的,所以会
困难一些.另外,由于本软件的实现平台是Linux,
所以要求用户熟悉Linux操作系统.
3.2 GTK+和MySQL开发过程中的问题
用GTK+和MySQL开发数据库应用,关键是
解决GTK+和MySQL相互融合的问题.由于GTK
+没有支持直接对数据库操作的控件,所以对数据
库操作的过程都将通过MySQL CAPI直接进行,然
后调用GTK+的显示功能完成与用户的交互,这比
Windows下开发工具直接使用控件操作数据库麻
烦.下面是一个GTK+和MySQL相结合的示例程
序[41.
MySQL操作程序结构:
void db-operate(char*abname)
{
Interface.create();/*界面的初始化*/
db-init(dbname); /*数据库的初始化*/
operate(); /*数据库操作*/
db.close(); /*数据库关闭*/
}
主程序结构:
gtk.init(&argc,&argv);/*GTK+初始化*/
db-operate(“db—name”)/*MySQL操作*/
gtk-m ̄(); /*GTK+事件循环*/
MySQL遵循Entry level SQL 92和ODBC level 0
—
2标准,但它并非完全按照上述标准实现.在开
发过程中,下列几个问题值得注意.
3.2.1子选择
在MySQL中下列语句还暂时不能使用:
SEL ECI'*FROM tablel WHERE id N(SEL
ECI'id FROM table2);
SEL ECT-K FROM tablel ,}Ⅱ'RE id NOT N
(SEL ECI'id RFOM table2);
但是可以重写查询,代替子选择语句:
维普资讯
长沙大学学报 2006年9月
SEL ECT mblel*FROM mble1.mble2唧RE
mblel id=table2 id;
SEL ECT tablel*FROM tablel凹JO玳
table2 ON tablel id=table2 id WH口地table2 id IS
NULL
3.2.2事务处理
MySQL不支持事务处理.MySQL将在未来短时
间内支持原子操作,用原子操作能执行一组玳.
SERT/SEL ECT/whatever命令,并且保证没有其它
线程介入.目前,可通过使用LOCK TABL ES和UN.
LOCK TABL ES命令阻止其它线程的干扰.
3.2.3线程编程
数据库的开发常常涉及多线程编程,这需要使
用一with—thread—safe—client参数编译MySQL
CAPI,这样能保证每个连接中的线程更安全.只要
两个线程不同时在同一个连接上发送查询到
MySQL,就可以让2个线程共享相同的连接.特别
地,必须保证在一个MySQL-query()和MySQL-store.
result()之间没有其它线程正在使用同一个连接.
许多线程能存取用MySQL-store.result()检索出来的
不同结果集合.
4通信原理和界面设计
4.1通信原理
TCP/IP协议向外界提供了原始的编程界面,
而不是直接为用户服务.应用程序通过编程接口来
访问TCP/IP,其中在Unix/Linux环境下的TCP/IP
编程接口( )就是Socket 函数.对于一个网络
聊天室系统采用的端一端通信,即客户机/服务器
模式(Client/Server),它是基于TCP/IP协议的网络
通信模式.针对该模式的实现方式,下面给出了一
个基本功能构造:
客户机一端,T℃P/II'应用程序功能如下:
(1)打开通信信道(申请一个套接字),并连接
到服务器在主机的保留端口,该端口对应服务器的
II'进程;
(2)向服务器发出请求报文,等待接收应答;
(3)从服务器方收到最终应答结果,或不再请
求时,关闭信道并终止客户机进程.
服务器一端,T℃P/II'应用程序功能如下:
(1)打开通信信道(申请一个套接字),通知本
地主机在某一保留端口接收客户机请求;
(2)等待客户机请求到达指定端口;
(3)接收到请求,启动一新进程处理用户请求,
同时释放旧进程以响应新的客户请求,一旦服务完
成,关闭新进程与客户的通信链路;
(4)继续等待客户机请求;
(5)如果不想响应客户机请求,关闭服务器进
程.
利用Socket进行通信,有以下两种主要的方
式:面向连接方式和无连接方式.在此要具体说明
的是有关面向连接方式的Socket通信.面向连接服
务器处理的请求往往比较复杂,不是一来一去的请
求应答所能解决的,而且往往是并发服务器.使用
面向连接的套接口编程,可以通过图3来表示.
对于使用面向连接的套接口编程,通常涉及以
下一些成员函数:
Socket() 创建一个套接字.
bind() 将所创建的套接口和本地网络地
址联系在一起.
1is咖() 使一个套接口进入监听状态.
accept() 确认一个连接.
connect() 连接一个套接口. ’
write()・ 从一个套接口接收信息.
() 从一个套接口发送信息.
close() 关闭此套接字.
接口工作过程如下:服务器首先启动,通过调
用socket()建立一个套接口,然后调用bmd()将该
套接口和本地网络地址联系在一起,再调用IL ̄..en
()使套接口做好侦听的准备,并规定它的请求队列
的长度,之后就调用accept()来接收连接.客户在
建立套接口后就可调用connect()和服务器建立连
接.连接一旦建立,客户机和服务器之间就可以通
过调用 ()和write()来发送和接收数据.最后,
待数据传送结束后,双方调用close()关闭套接口.
4.2界面部分实现的基本算法
4.2.1消息处理机制
GTK是一个事件驱动工具包,当它运行到gtk.
main()函数时会自动睡眠,直到有事件发生,控制
权转让给相应的函数调用,在该函数中可以用标准
C写出相应的事物逻辑.这与windows上的程序处
理是一样的.
对窗口对象上发生的事件(如按下鼠标,激活
键盘等),GTK也有相应的消息信号产生.这时就需
要程序员创建一个信号处理器来捕获该信号,并告
诉GTK程序事件发生后调用哪个回调函数.信号
处理器的创建函数定义如下[6]:
gim gtk—signal—connect(GtkObject*object,gehar
*naH .
GtkSignalFunc callback—time,gpointer itme.data);
维普资讯
总第73期 陈特放,黎丹:Linux下用GI1(+和Mf- ̄QL开发基于TCP/IP的网络聊天室
图3面向连接的套接字的系统调用时序图
返回值是一个区分同一对象中的事件与不同
回调函数的关联标签.这样可以做到一个对象的一
个信号就有任意多个回调函数,并且每一个都会按
照声明的顺序执行.函数调用的第一个参数是产生
信号的widget组件(即按钮等窗口构件),而删【Ile
了去除关联的对象名称.这样可以做到断开事件与
回调函数的关联,使得事件发生后,不会调用相关
的回调函数.
4.2.2布局格式
对GTK[7J显示格式的控制是通常通过打包盒
则是希望捕获的信号或事件的名称,callback.func
则是事件发生后所调用的回调函数名称,而第四个
参数func.data则是传递给回调函数的参数.
回调函数要定义在主程序的前面,它们的一般
格式都如下所示:
void callback—func(GtkWiget*wdidget,gtminter
func.data);
子来完成的.widget组件打包可以采用两种方式,
水平盒子和垂直盒子.若将widget组件打包进平行
盒子,组件就被依次水平的插入窗口;若是垂直盒
子,则组件排列是垂直的.产生新的水平盒子的函
数为
GtkWigetd gtk—hbox—new(gint homogeneous,
gint spacing);
调用下面这个方法允许将回调函数与事件的
关联断开:
void gtk—signal—disconnect(GtkObject*object,
gint id);
参数homogeneous是用来控制是否盒子中的每
个组件都有同样的大小(例如水平盒子中的控件有
同样的宽度,垂直盒子中的控件有同样的高度).
Spacig参数是组件之间的间隔.n
垂直盒子的创建函数是gtk.vbox.new(),定义
与水平盒子一致.
该函数的第二个参数就是上述gtk—signal—con—
nect()函数的返回值,即关联标签.第一个参数指向
维普资讯
58 长沙大学学报 2OO6年9月
gtk—box—pack—start()和gtk.box—pack—end()函数
是用来将打包对象放入这些盒子中的.
void g 一box—pack—start(GtkBox*box,GtkWid—
get*child,gint expand,gint fill,gint paddig);n
注意fiu取FALSE值,expand取TRUE值时与
expand取FALSE值,6U值无效的区别.前者的盒子
仍是原来创建盒子时指定的大小,而后者的盒子已
经缩小到打包组件的大小了.
创建的步骤
第一个参数是将组件塞入盒子的指针,第二个
参数是要塞入的组件指针.Expand参数是BOOL类 ①gtk一*一new()一调用一个非常有用的函数
来产生一个新的widget组件.
②用gtk—box—pack—start()函数连接所有的信号
和事件,产生相应的事件处理器来调用回调函数.
③设置widget组件以及调节器的特性.
④用合适的函数将widget组件打包到一个容
器(盒子或表格)中,例如gtk—box—container-start()函
型,用来控制组件与盒子之间的空间大小关系,其
中TRUE表示允许组件扩展至分配给盒子的空间
大/J、,FALSE表示盒子空间收缩至组件的实际大
小.函数中的fiu参数是用来控制是否将多余的空
间分配给组件,即将组件扩展到盒子的大小
(RUE),T或者多余的空间不变,保留作为盒子和打
包组件间的间隔(FALSE),该参数只有在expand参
数取TRUE时才有效.Padding参数是指组件四周
与盒子的间隔大小.
数或者gtk-container-add()函数等.
⑤用stk—widget—show()函数来显示组件.
图4聊天室客户端的界面
5结束语
GTK+是一种高级开发库,可以制作复杂的
图形用户界面;MySQL是一种快速的数据库管理系
统.虽然在Linux环境下的数据库开发工具与 一
参考文献:
[1】张银福.Linux网络应用技术[M】.北京:机械工业出版
社.1999.
[2]Paul DuBois.MySQL网络数据库指南[M].北京:机械工
业出版社.2000.
dows环境下相比还不成熟,但经过细心研究,结合
套接字和多线程技术,开发出了高质量的Chent/
Server数据库应用软件——网络聊天室,基本实现
了服务器端对数据及信息的管理和客户端之间的
聊天功能(如图4).此外,与其它开发环境相比,这
种环境具有极高的性能价格比.
【3】HarIow E,Developing Linux Application with GTK+and
GDK[M].MacmillRnt Computer Publishing House,1999.
[4]TCX.MySQL Reference Manual[B/OL].h ̄://www.
唧 .com/docmne ̄tafion/mysql/full/,2OOO一09—25.
[5]WarrenW.GAY.实战Linux Socket编程[M].西安:西安
电子科技大学出版社,2OO3.
[6]ArthurGrilflth.GNOME/GTK+编程宝典[M].北京:电子
工业出版社.2OO2.
[7]L0铲rI,战晓苏.GTK+程序设计c语言版[M].北京:清
华大学出版社,2OO2.
(责任编校:化石)
版权声明:本文标题:Linux下用GTK+和MySQL开发基于TCPIP的网络聊天室 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1713067942a618279.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论