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. 

(责任编校:化石) 


本文标签: 盒子 用户 函数 组件 数据库