0 引 言
在互联网高度发达的今天,MSN,QQ等网络聊天软件,使世界各地的相互联系越来越紧密,不论身在何处,只要上网,打开这些软件,就可以和朋友聊天。Linux作为一个开源的操作系统,正被越来越多的人认识并应用,它的特点在于操作系统源代码的公开化[1]。然而,基于Linux平台的聊天软件仍然存在操作不够人性化、交互界面不够美观等问题。因此,制作一个在Linux 操作系统下并且拥有人性化界面的即时通信工具,将给Linux操作系统的用户带来极大的方便。
本文基于Linux平台采用Qt编程设计并实现了即时网络通信系统,并对该系统进行ADB在线调试,测试结果证明,设计的发送框和接收框的通信功能能够顺畅运行。本系统的设计为后期设计某些相关通信系统提供了部分应用基础和开发经验。
1 Linux平台
Linux操作系统是Unix操作系统的一种克隆系统,它诞生于1991年的10月5日(这是第一次正式向外公布的时间)。以后借助于Internet网络,并经过全世界各地计算机爱好者的共同努力,现已成为今天世界上使用最多的一种Unix类操作系统[2],并且使用人数还在迅猛增长。
在Linux平台上运行的软件都是免费使用的,且可以随意的改动代码部分,只要他们是完全基于GNU的即可。
2 系统设计
本系统设计的基于Linux的聊天软件采用C语言和Qt图形开发软件进行编写,利用TCP方式进行连接[3?4]。通信服务方式整体采用C/S架构。
2.1 系统功能模块划分
(1) 服务器功能模块划分
登陆信息处理模块:检查登陆信息是否正确,并向客户端返回登陆信息。如果信息正确,就将服务器端在线用户信息发送给该用户,并在服务器端将该用户在线信息显示出来。
聊天信息处理模块:给指定的用户发送消息。
申请信息处理模块:注册新用户,确认后保存该用户信息。
发布系统消息模块:负责将用户登录信息发给每个客户端,并改写用户在服务器端和客户端的状态。
整个服务器功能模块图如图1所示[5]。
(2) 客户端功能模块划分
登陆功能模块:连接服务器并登陆,并返回登陆信息。
界面显示模块:显示用户好友及当前状态。
聊天功能模块:负责用户间的聊天信息。
离线消息模块:接收和发送离线消息,并做相应处理。
配置信息模块:负责用户基本信息配置。
2.2 服务器端设计
服务器开始运行后即处于监听状态,当监听到有客户端发出连接请求时,服务器立刻进入消息处理流程,由于采用并发服务器,所以可同时响应多个请求。具体流程如图2所示。
2.2.1 服务器主要变量和函数
服务器端用到的主要变量和函数如下:
套接字描述字:int sockfd, client_sockfd
套接字地址结构:struct sockaddr_in servAddr, cliAddr
线程ID标识:pthread_t pthd
线程调用函数:void gif_handle_client(int client_sockfd)
发送联系人状态函数:
void gif_send_clients_contact_list(chat *client_loginid,int client_sockfd, int type)
该函数的主要作用是当用户的在线状态发生变动时,服务器要及时地做出更新,并向该用户的联系人发送该用户状态变更后的信息。
获取系统时间函数:char *gif_get_system_time()
该函数读取当前系统时间并随消息一同发出。
2.2.2 服务器消息处理模块的设计与实现
服务器的消息处理模块主要由7部分组成,分别如下:
用户登录消息处理模块:当服务器接收到用户消息并判断是登录消息后,服务器将根据用户发送过来的用户名和密码到users.db表中进行匹配,如果匹配成功则把该用户加入到online.db表中,设置用户在线状态为真的,同时调用发送联系人在线列表函数,向添加该用户为好友的用户发送该用户的上线信息。如果匹配不成功,服务器将发送登录失败消息给客户端,要求用户重新登录。
添加好友信息处理模块:当服务器收到用户请求加好友的消息时,服务器首先在users.db中查找要被添加的用户是否存在,如果该用户存在则把该用户的信息存储到当前用户的好友文件中,同时在被添加好友用户的_as.db表中保存当前用户的信息。
删除好友信息处理模块:当服务器接收到用户的该消息请求时,服务器根据用户提供的好友用户名删除被指定的好友,同时将用户联系人表进行更新,在被删除的好友的被添加好友表_as.db中将当前用户删除。
用户聊天信息转发的处理模块:当服务器判断用户所请求的信息为聊天消息后,服务器根据用户所指定的聊天对象到online.db表中查找被指定用户是否在线,如果被指定用户在线则提取他的套接字地址结构,并按照该套接字信息将消息转发。如果用户不在线则将消息标识设定为离线消息,并将该消息写入被指定用户的离线消息文件中。
用户下线消息处理模块:当服务器判断用户所请求的信息为下线消息后,服务器将把用户从online.db中删除,设置该用户状态为下线,同时调用发送联系人状态函数,将标志位设置为离线向该用户的联系人发送。
离线消息处理模块:当服务器判断用户所请求的信息为读取离线消息后,服务器读用户的离线消息文件,如果该文件中有被标识为新的离线消息时,服务器将把该消息提取出来发送给用户,同时把该消息标识为已读。
删除离线消息处理模块:如果客户做出了删除离线消息的动作,那么服务器端将会根据用户的发送信息把该用户的离线消息文件中的离线消息删除。
2.3 客户端设计
软件的客户端采用图形化用户接口方式,Qt图形界面的主要特点就是事件触发,当某一窗体消息需要被处理时,处理引擎就会按照设计做出处理,图3描述了客户端的操作处理流程。
客户端运行后,首先登录服务器,如果登陆成功,服务器将在线的用户信息发送给客户端,此时客户端即可查看到用户信息。当用户会话时,聊天信息窗体负责发送和接收用户的聊天信息;用户离线时,该信息通过服务器转发方式发送给离线用户,当对方上线时便可查看该离线消息。
2.3.1 客户端主要窗口设计
本文设计的客户端提供图形用户界面,程序运行后,在主窗体上点击相应状态的按钮就会产生一个相应的操作,包括主窗体,登录窗口,添加用户窗口,系统消息窗口,离线消息窗口,聊天窗口。
主窗体:该窗体中包含了所有的用户操作按钮和好友列表,用户的操作都在这个窗体中完成,如图4所示。
当用户的操作成功或者失败时,系统会显示一条消息给用户,以便提示用户操作是否成功。在相关的函数内将该窗口的激活属性打开,消息窗口便会自动弹出并显示消息,如图5所示。
2.3.2 客户端功能模块的设计
用户认证模块:主要用到的函数为:connect(),send(),pthread_create()。当用户启动程序后,首先需要用户登陆到服务器才能进一步对软件进行操作,这一部分即为用户认证模块。
界面显示模块:当用户成功登陆后,在联系人列表中将会显示用户的联系人信息,在离线消息窗口中会显示接收到的离线消息,这两个视图均是用列表视图来实现的。
消息处理模块:当客户端和服务器建立连接后,客户端会创建一个专门的线程维护客户端和服务器之间的连接,该线程调用函数根据从服务器接收到的消息类型选择消息处理模块。
更新联系人列表信息:当判断接收到的消息为GIF_ADDRLIST_MSG时,程序将对联系人视图进行刷新以便及时地显示联系人的当前状态。实现刷新的方法是,先将以前的树移除,然后按照新的联系人状态进行树的绘制。
聊天信息:当接收服务器发送的消息类型为GIF_CHAT_MSG时,程序首先要确定是谁发出的聊天请求,然后判断聊天窗口是否开启,如果未开启则将开启标识设为真,然后打开聊天窗口。同时设置用户和联系人的显示颜色,以便区分聊天消息的来源。
消息请求成功或失败信息:如果接收到了GIF_SUCCESS_N_ERROR_MSG类型的消息,则程序还会进一步根据另外一个标识符判断是何种系统消息,并通过系统消息窗口显示给用户。
离线消息:如果接收到的消息类型为GIF_OFFLINE_MSG,程序会按照界面显示模块中对树视图的创建步骤,创建一个显示离线消息的视图用来显示离线消息。
以上几大模块构成了客户端功能处理的主体,大部分操作和消息处理都是由这些模块完成。
3 结 语
本文采用Qt编程技术,设计并实现了基于Linux平台的聊天软件功能,详细描述了系统服务器端和客户机端的实现过程,并对系统的工作流程和原理进行了详细论述。服务器经过测试后,能够稳定运行,客户端图形界面效果良好。本系统的设计为后续基于Linux平台的软件开发应用提供了参考和借鉴。
参考文献
[1] 黄伟敏.基于XMPP协议的Android即时通信系统设计[J].电子设计工程,2011,19(8):57?59.
[2] 毛红阁,郭红,陈东,等.Android移动通信序列化协议研究[J].南阳师范学院学报,2012,11(6):47?49.
[3] 攀建.ASP.NET+ADO.NET项目开发实例[M].北京:清华大学出版社,2004.
[4] JONES A R.ASP.NET从入门到精通[M].高春蓉,谷宇,阎隽,等译.北京:电子工业出版社,2002.
[5] WORLEY S.ASP.NET技术内幕[M].王文龙,刘湘宁,译.北京:人民邮电出版社,2002.
[6] 吉昂,袁杰,卞春华.Linux平台上的网络测试系统研究[J].现代电子技术,2010,33(20):110?113