Linux下基于Qt4的跨平台聊天系统设计

2014-07-24 04:59吴捷杜庆平
电脑知识与技术 2014年15期
关键词:跨平台

吴捷++杜庆平

摘要:在对当前聊天系统研究和分析的基础上,针对企业的实际需求,设计和开发了一种基于Qt4的跨平台聊天系统,该软件能够在局域网内部实现消息的即时传递。详细描述了系统的基本框架以及运行流程,重点讲述了利用UDP 实现高效可靠传输的基本原理和实现方法。软件采用典型的C/S(服务器/客户端)架构,用Socket编程设计网络通讯。运行结果表明,该系统工作情况良好。

关键词:Qt4;跨平台;UDP;Socket编程

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)15-3535-03

An Implementation of Cross-platform Chat Room Application Based on QT4 in LINUX

WU Jie, DU Qing-ping

(School of Information and Engineering, Taizhou Polytechnic College,Taizhou 225300, China )

Abstract: On the basis of research and analysis on existing chat system, and according to the requirements of enterprise, the developer designs and develops a system of cross-platform chat room which is based on Qt4. This software can realize the real-time delivery of messages on the LAN. This paper introduces the basic framework of this software and operation process, focusing on the basic principle and the implement method to achieve efficient and reliable transmission using UDP. The software uses typical C/S (client / server) architecture, socket programming of network communication. The results show that the system runs well.

Key words: Qt4; cross-platform; UDP; Socket programming

科学技术日新月异,全球信息化进程飞速发展,计算机和网络已经成为这个时代的“信息基础设施”。对企业而言,借助于网络,可以简化信息流程,提高信息交换的速度,从而提高工作效率。在企业内部,员工之间的信息交互是非常频繁的,在交互过程中,避免企业内部机密通过Internet泄露到外部是每个企业管理者需要重点考虑的问题。为了解决上述问题,人们提出了开发局域网聊天软件的构想,通过局域网聊天软件,企业员工可以进行即时消息传递,召开网络会议,发送内部文件等,在进行信息交互的同时又保护了企业内部信息的安全性。

聊天系统的实现有多种方式,其中比较流行的一种是基于Socket的集中式聊天系统[1]。这种聊天系统一般采用C/S(服务器/客户端)架构,其中服务器端实现与客户端的连接,接收来自客户端的聊天消息,并且根据客户端的要求把这些信息转发到另外一个或多个聊天客户中。并实现对客户端登录用户的管理与控制,实现客户端聊天信息的监控与保存。客户端实现与服务器端的连接,向服务器发送本客户的聊天内容,同时从服务器接受对方的响应,实现与其他用户的文本的发送,并实现聊天的功能。

近年来关于局域网聊天系统研究与设计方面的文献并不多,只有唐强等人[1-3] 做了相关工作。其中文献1基于Windows和Qt设计了一个局域网聊天系统;文献2基于Linux和Qt设计了一个局域网聊天系统;文献3同样是基于Linux和Qt设计了一个嵌入式聊天系统;这三篇文献的共同特点是使用Qt作为开发工具,用Socket编程设计网络通讯,在网络协议的选择上都使用了TCP协议。使用TCP协议进行事务处理时,每个客户端都必须与服务器端保持连接状态。这一方面需要消耗一定的服务器资源,另一方面,当存在大量客户端时,与每一个客户端保持连接状态是不现实的,因为通常Socket都有最大连接数限制,因此,该文改用无连接的UDP协议解决此问题。

本文设计并实现了一个跨平台局域网聊天系统,软件的开发是在Linux下结合Qt4完成的,选择UDP作为网络通信协议,运用Socket编程实现网络通讯,所开发软件适合在企事业单位内部使用,并可以快速移植到嵌入式设备中。

1 相关技术分析

1) Linux系统

Linux是一种自由和开放源码的类Unix操作系统,可运行在X86、Alpha、Sparc、MIPS、PPC、Motorola、NEC、ARM 等多种硬件平台。如今越来越多的企业和研发机构都转向Linux 的开发和研究, 特别是在新兴的嵌入式领域内Linux获得了飞速发展,得到了极其广泛的应用。Linux下的界面编程主要是通过Qt或者GTK[4]来实现。

2) Qt技术

Qt是诺基亚公司开发的一个跨平台的C++图形用户界面应用程序框架。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程,Qt也是流行的Linux桌面环境KDE的基础。Qt具有优良的跨平台性、面向对象,丰富的API、大量的开发文档等优点。Qt的“一次编写,到处编译”的特点使其非常易于部署在不同平台之上。近年来,很多学者都选择使用Qt开发应用系统[5-7]。endprint

3) UDP协议

UDP协议的全称是用户数据报协议,在网络中它被用于处理UDP数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。虽然UDP协议在可靠性方面不如TCP协议,但效率却比TCP高,当每次传送的数据量很少而且网络质量较高时,UDP也同样可以达到实用的可靠性要求。应用于局域网的聊天系统非常适合采用UDP协议。

4) Socket编程

为了提供进程间通信的一般方法和允许使用复杂的协议,实现不同主机之间的通信,Linux 使用了一种称之为套接字(socket)的机制。套接字是一种双向的通信端口,一对互联的套接字提供通信接口,使两端可以传送数据。每一个套接字都是一个数据通信通道。在两个进程通过套接口建立连接后,它们就使用套接口描述字来从套接口中读取数据,并向套接口写数据。

基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。

2 系统设计与实现

2.1 系统架构

本系统采用客户机/服务器(C/S)体系结构。网络通信双方角色上分为服务器端与客户端,如图1。

服务器端处理流程:建立套接字(socket())→绑定IP地址和端口号(bind())→客户端将连接此IP地址和端口号→接收客户端的数据请求(recvfrom())→事务处理→向客户端发送应答数据(send())→关闭服务器端socket。

客户端处理流程:建立套接字(socket())→向服务器发送请求数据(sendto())→等待服务器应答数据(recvfrom())→关闭客户端socket。

以上流程是一个单一事务流程.实际应用中需要进行多事务处理,因此本系统设计时还考虑了如下几个问题:

1)因为UDP是无连接状态,服务器端并不能感知客户端的存在,同样客户端也不能感知服务器端的存在。所以必须有一种机制能让对方知道彼此的存在状态。客户端定时向服务器端发送UDP数据包(称为sync同步数据包)。服务器端定时检查客户端登录状态,如果最后更新时间超过域设值,我们将认为客户端已断开连接。

2)sync同步设计原则,数据包大小尽量少,服务器端处理此包所占资源尽量少,定时设置长度适中。

3)在服务器端客户登录信息的存储方式问题。因为客户端的连接数可能非常庞大,因此一个简单的list队列已不能满足性能需求。我们采用哈希表来解决此问题。

4)事务包的设计问题。TCP有流的严格控制,数据的发送先后顺序必须在服务器端得以保证;但UDP没有流控制,客户端向服务器端发送后就不管了,有可能先发送的包在服务器端后接收到。因此,为了保证数据完整性,一个完整的数据包不允许分开两个数据块发送。在服务器端也是一次性接收一个完整的数据包。

2.2 系统功能

本系统支持的主要功能如下:

用户登陆;

用户与系统交互,进行文字传送;

用户好友登陆后,自动刷新列表;

聊天记录的保存;

清空聊天记录;

系统在实际开发时,没有直接进行套接字编程。因为 Qt中提供的Socket完全使用了类的封装机制,使用户不需要接触底层的各种结构体操作。并且,由于采用了其自身的信号和槽(signal—slot)机制,使编写的程序更容易被理解[6]。在开发过程中主要使用了Qt封装的QUdpSocket。下面就服务器端和客户端的主要实现方法进行具体分析。

1)UDP的服务器端

先创建一个QUdpSocket对象,绑定服务器端口号,监听客户端请求。部分代码如下:

void MainWindow::initSocket()

{

//绑定端口

udpSocket.bind(8888);

//接收消息信号槽 QObject::connect(&udpSocket,SIGNAL(readyRead()),this,SLOT(processDatagram()));

}

2)UDP的客户端

创建一个绑定好端口的QUdpSocket对象,当QUdpSocket对象每次要读入一个新数据的时候,就发送信号readyRead();再来就是编写我们自定义的接收数据函数了,利用QUdpSocket的readDatagram()函数即可获取数据。部分代码如下:

void Server::recvMessage(QByteArray *data)

{while(udpSocket→hasPendingDatagrams())

{data→resize(udpSocket→pendingDatagramSize()) udpSocket→readDatagram(data→data(),data→size(),&serv_ip,&serv_port);

}}

2.3 系统运行

系统开发完成后,在RedHat Linux企业版6下面运行该系统的服务器端和客户端,运行结果良好(如图1、图2)。

图1 客户端登陆界面 图2 服务器端登录信息

图1是客户端登陆之后的界面,从中可以看到每个用户都能从自己的用户列表中看到系统中当前在线的用户;图2是服务器端运行之后的界面,其中包含客户端的登陆信息,并且可以给客户端群发消息;该系统也可以在Windows下重新编译代码,或者经过交叉编译移植到嵌入式系统中进行测试,在这里就不详细叙述了。

3 结束语

本文在成熟的Linux操作系统下,采用Qt跨平台的C++图形用户界面应用程序框架,设计并实现了一个局域网聊天系统。该系统采用UDP作为通信协议,可以实现高效的信息传输,并且能在多个平台下编译运行,可移植性很强。将来的改进方向主要是进一步优化系统界面,增强其功能,使之成为一款成熟的产品投入使用。

参考文献:

[1] 唐强.基于C/S 架构的局域网通信工具设计[J].计算机光盘软件与应用,2012 (21):191-192.

[2] 王苏敏,陈淦,廖晶晶.Linux下基于QT的局域网聊天系统[J].计算机光盘与软件,2012 (22):130-132.

[3] 赵祖龙.基于Qt /Embedded的嵌入式跨平台聊天系统设计[J].信息技术,2010 (12):144-147.

[4] 林庆,吕智慧,李松年,等.基于Linux平台同步教学课件播放工具的设计与实现[J].计算机应用与软件,2008,25(2):4-6,23.

[5] 蒋业军,叶艳,吴敏.基于Qt 的计算机辅助英语系统的考试作答系统的设计与实现[J].计算机应用与软件,2012,29(12):196-197,236.

[6] 周名阳,韩秀玲.基于Qt的图像数据网络传输应用研究[J].计算机工程与设计,2011,32(6):1901-1905.

[7] 刘超,周纪超,张红星.基于Linux Qt的列车人机界面设计与实现[J].计算机与现代化,2013(4):215- 219.

猜你喜欢
跨平台
跨层级网络、跨架构、跨平台的数据共享交换关键技术研究与系统建设
一款游戏怎么挣到全平台的钱?
潜力双跨平台:进阶:谁将跨入下一个“十大”?
跨平台APEX接口组件的设计与实现
基于C++语言的跨平台软件开发的设计
基于C++语言的跨平台软件开发
移动互联网应用跨平台开发
一种虚拟现实应用程序跨平台方法的研究
基于QT的跨平台输电铁塔监控终端软件设计与实现
基于OPC跨平台通信的电机监测与诊断系统