APP下载

Linux平台下基于GTK+的聊天室设计

2012-10-27余长江周渊平吕海龙

通信技术 2012年5期
关键词:描述符聊天室服务器端

余长江, 周渊平, 吕海龙

(四川大学 电子信息学院,四川 成都 610065)

0 引言

Linux作为一种开放源代码的操作系统,对于软件未来的发展方向起着一定的引导作用,其主要特点有:源代码完全开放;具有多用户特性并支持多进程与多线程;系统安全性可靠;拥有良好的用户界面;网络功能强大;支持多平台;良好的兼容性等等。由于 Linux系统的诸多特性,使其在服务器和个人应用以及企业开发领域中的应用越来越普遍[1],在Linux环境下开发图形界面也成为了众多编程者的选择。

GIMP是一种基于 Linux平台且能与Photoshop相媲美的图像处理软件,而 GTK+最初则是 GIMP的专用开发库,后来逐渐发展为Linux下开发图形界面应用程序的主流工具之一,它使用 C语言开发,可以灵活的应用于不同系统,备受开源软件开发者瞩目。GTK+具有的特性如下:动态类型系统;用C语言编写对象系统;实现了继承、类型检验,以及信号/回调函数的基础结构;类型和对象系统不特别针对GUI;GTK Widget对象使用对象系统,它定义了GTK+的图形组件的使用接口;大量的 GTKWidget构件[2]。GTK+2.0的协议 GNU宽通用公共许可证(LGPL,GNU Lesser General Public License),允许任何开发者使用(包括那些开发中的专利软件)且不收取任何费用。GTK+2.0是当今唯一100%零付费的工业级的图形界面开发工具 。采用GTK+2.0编程技术设计出一个聊天室,再结合多线程技术,可实现在服务器端和客户端之间的聊天功能。

1 聊天窗口的设计

本聊天室分为服务器端和客户端两部分,采用GTK+2.0,即可用简短的代码来编写窗口并向窗口中插入各个控件,通过灵活地使用信号/回调函数机制,实现通信连接、信息发送、关闭窗口等功能,聊天室如图1和图2所示。首先运行服务器端,单击“开启”按钮后服务器端等待客户端连接,再运行客户端,在登陆框输入服务器端IP,单击“登录”按钮即可与服务器端连接,然后双方就可以进行通信了。

图1 服务器端聊天室

图2 客户端聊天室

2 聊天过程的实现

聊天过程采用TCP/IP协议下的Client/Server网络通信模式实现,通过套接字(Socket)接口可方便的实现TCP、UDP传输协议完成数据的网络传输[4],对可靠性要求高的数据通讯系统往往使用TCP协议传输数据 。Socket是网络通信的基本构件,可看作网络通信的一个端点,在网络通信中使用 Socket函数必须有客户和服务器2个进程,以实现网络端点之间的连接和数据交换[6]。在双方进行通信前,要先运行服务器端程序,等待客户端的连接。开启服务器端后主要有以下工作。

(1)建立一个socket通信

调用函数socket(int domain, int type, int protocol)来建立一个套接字,即向系统注册,通知系统建立一个通信端口。参数 domain 表示所采用的地址类型,此处取值为AF_INET,即ARPA internet地址格式;type为新套接口的类型描述,取值为SOCK_STREAM,表示提供双向连续且可信赖的数据流,即 TCP;protocol表示 socket所使用传输协议的编号,通常取值为0。若成功则返回一个socket描述符。

(2)对 socket定位

调用函数 bind(int sockfd, struct sockaddr *my_addr, int addrlen)将新建的套接字与本地网络地址联系起来。sockfd即为调用socket函数后所返回的socket描述符;my_addr为包含本机IP地址和端口号的指针;addrlen为sockaddr的结构长度。

(3)等待客户端的连接

调用函数listen(int sockfd, int backlog)使socket处于监听模式。参数backlog表示同时能处理的最大连接数目。listen()并未开始接收连线,只是设置socket为监听模式,调用accept()成功后才是真正接收客户端的连线。所以listen()应该在socket(),bind()之后,在accept()之前调用。

(4)接收客户端socket连线

调用函数accept(int sockfd, struct sockaddr *addr,int *addrlen)来接收客户端的连线请求。sockfd是被监听的socket的描述符;连线成功后,addr所指的结构会被填入客户端主机的地址数据;addrlen是sockaddr的结构长度。若连接成功则返回新的socket处理代码。

相对服务器端复杂的过程而言,客户端的工作比较简单。

运行客户端程序后,在登录框输入服务器端IP地址,该点间隔地址将被函数 inet_addr()转换成in_addr结构的地址,然后单击“登陆”按钮,此时程序首先调用函数socket(),像服务器端那样建立一个套接字,然后调用函数 connect(int sockfd, struct sockaddr *serv_addr, int addrlen)将客户端连接至服务器端。sockfd即为新建的客户端的socket描述符;serv_addr所指向的结构被填入经 inet_addr()转换后的地址;参数addrlen为sockaddr的结构长度。

客户端与服务器端连接成功后,双方即可进行通信,send()和recv()这两个函数用来在面向连接的socket上进行数据传输,其调用方式如下:

1)函数send(int sockfd, const void *msg, int len,int flags)用来发送数据。sockfd是建立好连接的socket描述符;msg指针指向要发送的数据;len是以字节为单位的数据的长度,flags设置为0。

2)函 数 recv(int sockfd, void *buf, int len,unsigned int flags)用来接收数据。sockfd是建立好连接的socket描述符;buf指向存放接收数据的缓冲区;len是缓冲的长度;flags设置为0。

3 多线程技术

进入聊天程序后,程序要不断检测是否有新的信息发送过来,如果只是简单的采用无限循环这个操作,程序会进入死机状态,此时就无法进行发送信息等其他的操作了,而使用多线程技术,就可将接收信息的操作置于一个新的线程,从而避免无法发送信息的情况。所谓多线程,就是将一个进程分成多个执行线程,各个线程可以独立运行。多线程程序采用一种多任务、并发的工作方式,主要优点有:提高应用程序的响应;更有效的使用多处理器;改善程序结构;占用较少的系统资源。

在 main函数中创建多个线程,则该程序运行时,操作系统为每个线程分配不同的CPU时间片,并根据线程优先级进行调度。由于每个时间片的时间很短,虽然实际上同一时刻只有一个线程在运行,但是看上去好像多个线程是并发运行[7]。客户端程序中的多线程代码框架如下:

若使用线程,在初始化 GTK+库函数之前必须运行 g_thread_init(NULL)和 gdk_threads_init()来初始化线程应用。创建线程调用函数g_thread_create(),如上面程序中,g_thread_create()函数用来生成接收消息的线程,get_message()即为线程的具体事件回调函数。当线程例程(即线程执行的代码)开始时,通过gdk_threads_enter()来获得一个唯一的全局锁,当线程例程返回时,通过gdk_threads_leave()释放该全局锁。线程创建成功后,新创建的线程开始运行回调函数且不影响原来的线程继续运行。同样,服务器端的多线程编程与此类似。

4 结语

随着开源编程的迅猛发展,在Linux下开发程序已成为一种潮流,XWindow和 GNU编译系统已成为Linux上最主要的软件系统,GTK+作为这两者相结合的编程开发包更是广受欢迎。通过对GTK+编程技术的研究,设计了一个简单的聊天室,采用TCP/IP协议下的Client/Server网络通信模式,详细介绍了聊天时双方通信的建立和信息收发的方法,再结合多线程技术,实现了双方正常的聊天功能。

[1]初振林.Linux安全强化方案[J].信息安全与通信保密,2007(11):49-50.

[2]张同光,潘红.Linux中GTK+编程技术研究及其应用[J].软件导刊, 2007(08):38-40.

[3]宋国伟.GTK+2.0编程范例[M].北京:清华大学出版社,2002.

[4]陈周国.基于Linux QT技术的远程监控GUI设计[J].通信技术, 2009, 42(12):234-236.

[5]李磊,刘嘉勇.关于对 QQ文件传输特点的研究[J].信息安全与通信保密, 2011(04):36-37.

[6]曹玲芝.基于DDE和Socket技术的网络控制系统仿真平台[J].通信技术, 2009,42(08):30-33.

[7]金卫民,鲁志康.GTK环境下的多线程设计[J].微计算机信息, 2008, 24(07):310-312.

猜你喜欢

描述符聊天室服务器端
基于结构信息的异源遥感图像局部特征描述符研究
Linux环境下基于Socket的数据传输软件设计
基于AKAZE的BOLD掩码描述符的匹配算法的研究
基于深度学习的局部描述符
歌剧聊天室 洗洗晒晒,又是新一天
歌剧聊天室 永远盛放的雪绒花
基于Qt的安全即时通讯软件服务器端设计
基于Qt的网络聊天软件服务器端设计
特征联合和旋转不变空间分割联合的局部图像描述符
百万级SUV聊天室(5人)