Linux环境下即时通信软件设计与实现 下载本文

内容发布更新时间 : 2024/12/23 10:44:50星期一 下面是文章的全部内容请认真阅读。

龙源期刊网 http://www.qikan.com.cn

Linux环境下即时通信软件设计与实现

作者:李伊林 傅小英

来源:《软件导刊》2014年第06期

作者简介作者简介:李伊林(1984-),男,江西省水利科学研究院助理工程师,研究方向为网络通信;傅小英(1987-),女,南昌大学信息工程学院硕士研究生,研究方向为计算机应用。1QT简介

QT是一个跨平台的C++图形用户界面库,由挪威TrollTech公司于1995年底出品。QT的对象间通信采用信号/槽(Signal/Slot)机制,其中Signal犹如MFC中的事件,而Slot则是响应事件的方法。如果要实现对象间的通信,只需要把一个对象的Slot和另一个对象的Signal连接起来即可实现事件驱动[1]。

由于本系统是通过QT[2]图形开发工具来实现与用户之间的接口设计,所以在Eclipse中如果要使用QT,则需添加QT插件方可建立QT GUI工程文件。 2系统总体设计

本系统实现了Linux系统下的简单通信,同时可以动态刷新在线用户列表,并与其他用户进行聊天通信或传送文件等[3]。如果用户想与其中某位好友聊天,则应该与其建立连接,此时两个客户端有一个作为服务器,另一个作为客户端。本系统的主要架构如图1所示。 系统主要分为客户端和服务器,服务器并不对用户发过来的信息进行转发操作,因为该做法会增加服务器的工作量。它只负责监听客户端的连接请求,同时,在与客户端建立新连接时,服务端会对客户端的端口号进行注册,之后将端口信息提供给每个连接上的客户端[4]。因而两个客户端之间的通信则不需要以服务器作为转发站,而是可以直接进行通信,从而减少了用户之间的通信响应时间。客户端主要可以进行注册、查找密码、添加/删除好友等一些基本操作[5],与好友建立连接之后,还可与好友进行聊天,互传文件等。 图1系统架构 3关键技术实现

3.1客户端Listfriend类实现

Listfriend类主要用来显示当前用户的好友列表,并按好友的不同组号将其进行分类。同时,用户可以通过触发右键事件对自己的好友列表进行修改,如添加、删除、移动好友,修改好友备注,修改用户信息等。在该类中,用户还要对自己的端口号进行监听,如果有好友提出聊天请求,用户可以根据自己的意愿接受或拒绝。或者用户自己向好友提出聊天请求,如果好友拒绝,则关闭对话框[6]。

龙源期刊网 http://www.qikan.com.cn

Listfriend类的主要实现方法如下:

Listfriend::Listfriend(QWidget *parent,User *a_user):QDialog(parent) {// 右键菜单设置

familyitem = new QAction(tr(\移动到家人\

connect(familyitem,SIGNAL(triggered()),this,SLOT(moveFamilyGrpSlot())); ……………………………………………………………… //右键二级菜单

grp1 = new QActionGroup(this); grp1->addAction(frienditem); grp1->addAction(familyitem); grp1->addAction(stuitem);

//为listview控件绑定事件(单键事件、双键事件),以及其它控件的事件绑定(下拉列表、查找按钮、查找好友等)

connect(familylistview, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(getFriNum(QListWidgetItem *))); …………………………… //定时器初始化 time = new QTimer();

connect(time,SIGNAL(timeout()),this,SLOT(updateListSlot())); //刷新列表定时向HOST发送信息

connect(time,SIGNAL(timeout()),this,SLOT(sendMsgToHost())); //定时向HOST发送信息 time->start(10000);//10s 3.2客户端Chatting类实现

Chatting类是用户与好友进行聊天的窗口,用户之间可以发送信息:

龙源期刊网 http://www.qikan.com.cn

Chatting::Chatting(QWidget *parent, QString usernum, QString frinum) : QDialog(parent) {

//向好友发送连接请求 connect to the client clientsocket = new QTcpSocket(this); QHostAddress serverip(\

clientsocket->connectToHost(serverip,(frinum.right(5)).toInt()); //信号与槽的绑定:涉及的相关操作有连接、接收以及进度条 connect(clientsocket,SIGNAL(connected()),this,SLOT(clientConnected()));

connect(clientsocket, SIGNAL(bytesWritten(qint64)),this, SLOT(updateClientProgress(qint64))); // 更新进度条

…………………………………………………… }

其中fileDialogSlot()、getFileSlot()两个方法是对文件对话框的操作,sendSlot()是向对方发送信息或文件的触发按钮,若只是发送信息,则可直接发送给对方。若是发送文件,则应先发送文件头,将文件名和文件大小发送给对方;clientRecvData()是接收对方发过来的信息,对信息进行解析,并对其分类处理。其中接收到的消息类型有:对方拒绝聊天、普通信息、文件头、文件内容等。 3.3服务端Server类

Server类是服务器的主程序,它对incommingConntection()方法进行了重写,主要用于监听服务器端口,如果有请求到来,则实例化一个ServerThread对象,用一个单独的线程处理与客户端的通信[7]。

void Server::incomingConnection( int socketdescriptor) { //有请求到来时,则执行该函数,参数为其套接字描述符 qWarning()

ServerThread *thread = new ServerThread(0,socketdescriptor);