APP下载

Linux平台即时通信系统的研究与开发

2017-04-14赵向兵张景安

软件 2017年2期
关键词:线程好友按钮

赵向兵,张景安

Linux平台即时通信系统的研究与开发

赵向兵,张景安

(山西大同大学数学与计算机科学学院,山西 大同 037009)

针对目前信息安全成为国家重要安全战略,中国军用电脑已装国产操作系统“麒麟”等,信息电子产品国产化必将成为趋势,而麒麟操作系统是一款基于Linux的操作系统,但是在Linux局域网环境下没有一款即时通信软件可供选择。经研究Linux Socket网络编程,及用户界面编程知识,本文设计出基于Linux的C/S模式即时通信系统,此设计基于Linux C语言开发,使用GTK制作图形界面,并涉及到TCP/IP和POP/SMTP协议,实现聊天,记录聊天记录,发送电子邮件,发送文件功能。从而填补国家信息电子产品国产化在即时通信方面的空白。

信息安全;麒麟操作系统;Liunx;即时通信系统

0 引言

2013年“棱镜门”事件已经暴露了我国国内信息安全的极大隐患,国内的重要信息系统、操作系统、数据库、中间件等几乎都来自国外产品,国内信息电子产品主要部件过度依赖进口,如果信息电子产品植入监测插件,就会成为窃取情报的手段。随着信息安全隐患问题日渐凸显,国家已经加强重视信息安全问题,并把信息安全列入国家重要安全战略之中。微软目前主打的Windows 8操作系统采用不安全的技术架构,并且系统集成的杀毒软件可以自由扫描用户电脑,势必失去电脑的控制权,导致用户个人信息的泄漏。2014年5月中央国家机关政府采购中心发布通知,中央机关所有计算机类产品不允许安装Windows 8操作系统。同时,我国将实行网络安全审查制度,工信部也提出措略支持国内软件信息服务业发展。要解决国家安全战略问题迫切需要国内信息安全的自主创新,自主可控的国产产品才是安全可信的,才能真正全面完整有效抵御境内外敌对黑客势力的渗透、入侵[1]。

在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,网络聊天已成为上网族的一种普遍的休闲方式,所以,一款好的即时通信[2-3]聊天软件成了上网的必备工具之一。国产操作系统基本以安全性能良好的Linux操作系统为基础,但是当前在Linux局域网环境下没有一款即时通讯软件可供选择,本文设计出基于Linux的C/S模式即时通讯系统,它是基于Linux C语言开发,使用GTK+制作图形界面,并涉及到TCP/IP和POP/SMTP协议,实现聊天,记录聊天记录,发送电子邮件,发送文件功能。

1 系统整体框架

1.1服务器端功能

系统对于用户权限的限制主要是在服务器端(如图1)进行管理控制。管理员登录系统后,开启服务器,可对用户资料和聊天记录进行查询、删除等操作。这些数据和信息将存入后台数据文件中保存,而普通用户只有通过注册到服务器后验证通过才可使用服务器提供的服务,服务器具有的功能:验证登陆信息,发送系统信息,处理新用户的申请信息,更新用户服务。

图1 服务器功能结构图

1.2客户端功能

客户端基本功能包括:(1)用户的登录与注册:记录用户的个人提交信息,包括合法邮箱等,注册成功后返回账号作为用户系统唯一标识。在下次登录的时候,即可仅通过验证账号和密码来实现登录;(2)用户之间的信息交换:用户好友列表中的互加好友可以完成文字信息和文件的传递;(3)用户资料的查看和修改:在聊天的过程中,用户能查看感兴趣用户的个人信息;(4)显示在线好友:用户登陆后会从服务器返回用户的对应好友列表信息及登陆状态信息;(5)利用POP3协议发送指向特定邮箱的邮件。

2 系统设计

2.1数据表结构设计

本系统服务器采用Mysql数据库软件,Mysql是一个开源的小型的关系型数据库管理系统[4]。目前Mysql数据库集成LMAP、WMAP框架,其体积小、速度快、总体拥有成本低,作为WEB开发中后台数据存储的主流平台[5-6]。

数据库(Mysql):在使用Mysql时必须将数据库帐号设置成root密码:123456,该数据库中包含有一个用户表,服务器处理用户信息都是对这个表进行操作的。用户表(usermsg):用户表里包含了用户的所有可以用到的信息,有帐号,称昵,密码等信息。用户信息表(usermsg)见表1。

图2 客户端整体框架

表1 用户信息表(usermsg)

2.2GTK +和Mysql开发过程中的问题

结合Mysql、Linux、GTK +开发系统,为了解决GTK+缺少数据库API的问题,本文利用Mysql提供的CAPI 实现数据的存储,GTK+仅作为用户间交互的界面开发。利用GTK+提供的事件传递机制实现整个模块功能的集成[7]。下面是一个GTK +和Mysql相结合的示例程[8]:

Mysql操作程序结构:

void db-operate (char *abname)

{ Interface-create();/ /界面的初始化

db-init (dbname) //数据库的初始化

operate(); // 数据库操作

db-cIose(); / / 数据库关闭

主程序结构:

gtk-init (Sargc, Sargv);/ /GTK + 初始化

db-operate (“db-name”)/ / MySOL操作

gtk-main ();/ /GTK + 事件循环

2.3系统界面设计

GTK +有丰富的GTK Widget构件,这些构件实现了类型、继承检验和信号/回调函数的基础结构。由C语言编写这一特性决定了它有很好的可移置性。本文采用GTK+2.0编程技术实现服务器端和客户端程序界面设计。通过GTK +的事件传递机制。实现通信连接、信息发送、信息提交,信息验证,文件传送等功能[9],即时通讯系统主要界面包括:1)登陆界面:双击客户端应用程序,弹出登录窗口,本界面需要两个文本框和两个命令按钮,一个是用户账号文本框,一个是用户密码文本框和一个登陆按钮,一个注册按钮;2)注册界面:点击注册按钮跳到注册窗口,输入指定信息注册成功后弹出账号提示信息,这时请牢记自己注册的账号,返回登录。应设计四个文本框和两个命令按钮,四个文本框分别用于输入网名,密码,密码,电子邮件,两个按钮分别是提交和重置;3)主界面:登陆成功后可弹出好友列表即主界面,该页面显示所有在线的好友,主窗口会显示当前用户的信息及好友列表,好友列表分成在线好友和不在线好友,不能与不在线好友聊天,单击一个不在线好友即弹出不能会话提示对话框;4)聊天界面:点击在线好友,可弹出聊天对话框,包含的构件应该有一个显示聊天消息的列表框,一个发消息的文本框和一个历史记录按钮,一个文件传输按钮及一个发送邮件按钮;5)文件传输界面:文件传输界面有包含一个选择文件的选择框和一个发送按钮;6)发送邮件界面:一个输入电子邮件地址的文本框,一个输入标题的文本框,一个输入正文的列表框及一个发送按钮;7)聊天记录界面:聊天记录界面只要一个显示聊天记录的列表框就行了。

3 Socket即时通信设计关键技术

网络通信的关键是Socket(套接字),是一个通信链的句柄,用于描述IP地址、端口号,连接建立后,则可以发送消息或执行命令。采用C/S模式的程序中,服务器端和客户端都要拥有属于自己的Socket。通常服务器程序用listen(sockfd,MAX_ CLIENT)监听指定的端口,接收用户的Socket请求,异步处理多个登陆管理员客户端的请求。假如客户端发出TCP请求,服务器会新建专用与这个客户通信的Socket,并把这个Socket加入到FD_SET套接字集合中,运用select(maxfd,&sockset,NULL,NULL,NULL),循环遍历所有的Socket处理有信息请求的客户端请求。远端客户端,使用Socket通过connet( )向服务器发出连接请求,服务器返回接受确认后,就可以发送消息或执行命令,并且建立不死线程通过该线程等待服务器给客户端的信息,具体是通过select(sockfd+1,&sockset,NULL,NULL,NULL)阻塞等待服务器的信息。会话完成后,关闭Socket[10]。

远程控制通过如下几个步骤实现:

第一步,Socket定义,本系统服务器端采用重复服务器模型[9],算法[14]如下:

SOCKET( ); //建立Socket

BIND( ); //与网络地址和端口号绑定

LISTEN( ); //在绑定的套接字上监听客户端发来的网络请求

FD_ZERO( ); //清空套接字集合

FD_SET(sockfd,&sockset);//将监听套接字加入集合初始集合

maxfd=max(maxfd,sockfd+1); //替换最大的套接字号

for (;;)

{ select(maxfd,&sockset,NULL,NULL,NULL);//异步遍历套接字集合查看状态有没有变化

new_sockfd =ACCEPT( ); //接受状态有变化的套接字

FD_SET(new_sockfd,&sockset);//将监听到的套接字入集合

WHILE(1)

{

READ( ); //从套接字中读取数据

PROCESS( ); //解析收到的数据包,匹配后进入第六步进行相应的处理

WRITE( ); //从套接字中写入数据

CLOSE( ); //关闭套接字

}

第二步,接收数据,解包,实现数据检测和匹配;

4 界面部分实现的基本算法

4.1Linux内核线程处理机制

即时通信启动后,程序要一直在监听是否有新的信息到达。基于功能特性决定为避免程序进入假死状态,程序要采用多线程机制。将等待监听作为一个单独运行的子线程,可以提高程序响应效率,提高用户体验,这个线程也叫心跳线程。本系统在main( )函数中创建多个线程,由linux系统组织线程的合利调度[12]。

GTK+中使用线程,利用g_thread_init(NULL)和gdk_threads_init()完成前期工作。g_thread_create()函数创建线程,接收消息的线程由g_thread_create()函数创建。线程的具体事件回调函数由get_message()函数执行。对于GTK+设计中的线程互斥由于gdk_threads_enter(),gdk_threads_leave()完成全局锁的获得和释放。心跳线程启动后信息回调函数就被激活。各功能子线程各司其职完成相应的操作。同样,客户端的多线程编程与此类似。

4.2GTK消息处理机制

GTK+的本质是事件驱动,gtk-main()函数启动时程序进行静默状态,用户点击界面操作后激活事件,程序被唤醒,GTK+将主线程执行权交给处理用户操作的函数,这一系列操作都是由ANSI C语言完成功能逻辑的。窗口控件事件发生,激活消息信号,GTK+专门的信号处理机制会捕获信号[13],将激活相应的回调函数完成信号处理。

对象事件与回调函数的关联标签是由不同的返回值决定的。按照函数声明的顺序执行回调函数,可以解决同一个对象与多个回调函数的匹配。信号处理器的创建函数定义中,参数object表示产生信号的 widget构件,参数name表示捕获的事件或信号的名称,参数callback-func表示事件的回调函数名称,参数func-data表示回调函数的参数存在[11]。要在主程序的前面定义回调函数,函数声明为:void callback-func(Gtkwidget widget,gpointer func-data)。以服务器启动主程序为例,服务器启动主程序启动函数是:void button_start_clicked(GtkWidget * button,gpointer data)。

这个函数是进入主线程的接口,它初始化一些变量,打开监听端口及进入主线程。服务器启动时会通过POP3将启动好的服务器地址及端口号发到互联网上的一个邮箱上去,原因客户会使用这个地址及端口号,客户端启动时从邮箱中读这个邮件就可以知道服务器启动时的IP地址及端口号了,这样省去很多麻烦,其实现包含在下面的函数中:

void button_start_clicked(GtkWidget * button,gpointer data);

主线程负责创建激活其他四个子线程,主线程函数原型是:

void go_to(void);

下面介绍由主线程创建的四个子线程的作用及函数原型。负责处理登陆信息的线程的函数原型:

void func_check(struct check *k);

负责处理注册信息的线程的函数原型:

void func_check(struct check *k);

负责处理退出信息的线程的函数原型:

void func_quit(char ipip[40]);

系统消息是通过一个函数一个一个向所有在线用户发的系统消息,这个函数原型是:

void button_message_clicked(GtkWidget * button,gpointer data);

给出程序中函数之间运行顺序跟关系的参照图如图3所示。

图3 函数之间运行顺序跟关系的参照图

5 系统功能测试

在Linux环境下运行客户端,以局域网中的一台主机作为服务器。另外选取两到三台电脑作为工作用户机按照如下进行测试:

(1)注册测试

(2)登陆测试

(3)私聊测试

(4)文件传输测试

(5)接收系统消息测试

测试的结果为:

1. 注册页面输入以下信息:网名:王晓博,密码:123456;第二个密码框:123456,电子邮件:1wangxiaobo@163.com得到:(登陆账号:10012)注册成功的页面如图3所示。

2. 登陆页面输入以下信息:帐号:10012 ,密码:123456。登陆成功的结果如图4所示。

3. 首先登陆两个账号,如(账号10011,密码123;账号10013,密码123456)。然后. 打开聊天窗口,相互发送信息如图5所示。

4. 在聊天窗口点击消息记录按钮,选择一个文件如图6所示。点击确定。而后发送结果如图7所示。

5. 在服务器发一个系统消息,客户端接收如图8所示。

图3 返回注册账号图

图4 返回好友列表

图5 两个人进行聊天

图6 选择文件

图7 发送结果图

8 系统消息图

6 总结

随着国内电子信息产品国产化,在Linux环境下开发即时通信系统势在必行,本文实现的基于Liunx + Mysql + C + GTK设计的即时通信系统,这种环境具有极高的性能价格比,较强的安全性,为减少信息安全隐患,防止信息外泄做出贡献。现阶段此即时通信工具尚未达到强大功能,在下一阶段将继续把这个即时通信系统的功能更加完善。

[1] 吴勇毅. 工信部力挺软件国产化政策机遇促行业大发展.通信信息报[DB/OL] http://it.people.com.cn/n/2014/0605/ c1009-25108211.html.

[2] 刘皓. 分布式环境下可靠数据同步及通讯的协议分析[J].软件, 2015, 36(9): 113-116.

[3] 张勇, 裴东良, 张会兵. 消息传输系统研究[J]. 软件, 2016, 37(3): 51-54.

[4] Shuyan SUN, Xiaojuan QI, Yongji YANG. The Design of Scientific Research Project Management System in Universities[J]. Management Science and Engineering, 2014, 8(1): 57-61.

[5] Yuanzhe Zhao, Chundong Hu, Peng Sheng, Xiaodan Zhang, Deyun Wu, Qinglong Cui, Rui Zhang, Yulian Lin, Application Software of Main Control Server for Neutral Beam Injection Control System[J]. Journal of Fusion Energy, 2014, 33(4): 412-416.

[6] 周京晖. 集成消息服务和定时通知的分布式内存数据库[J].软件, 2013, 34(1): 89-92.

[7] 陈特放, 黎丹. Linux下用GTK+和MySQL开发基于TCP/IP的网络聊天室[J]. 长沙大学学报. 2006, 20(5): 54-58.

[8] 宋劲杉. Linux C编程一站式学习[M]. 电子工业出版社, 2009: 276-284.

[9] Harlow E Developing Linux Application with GTK+ and GDK[M]. MacmillanComputer Publishing House, 1999.

[10] 左岩, 赵建玉, 张红. 基于Linux的嵌入式数据采集装置的TCP/IP通信[J]. 暨南大学学报(自然科学版). 2014, 28(3): 194-197.

[11] 苑晓芳, 刘志广. Linux下基于TCP传输组建的实现[J]. 无线电通信技术, 2014, 40(4): 46-49.

[12] Neil Matthew, Richard Stones. Beginning Linux Programming(4 edition)[M]. Wrox, 2007.

[13] 余长江, 周渊平, 吕海龙. Linux平台下基于GTK+的聊天室设计[J]. 通信技术, 2012, 45(5): 98-100.

[14] Emoto. M, Shibata. K, Watanabe. K, Ohdachi. S, Ida. K, Sudo. S. Development of a flexible visualization tool[J]. Fusion Engineering and Design, 2002, 60(3): 367-371.

R&D of the Linux-Based Instant Messaging System

ZHAO Xiang-bing, ZHANG Jing-an
(School of Mathematics and Computer Science, Shanxi Datong University, Datong Shanxi 037009)

For current Information Security has become an important national security strategy, China-made military computer operating system “unicorn” has been installed, and domestic electronic information products will become the trend, while Kylin operating system is a Linux-based operating system, but under the Linux LAN environment there is not an instant messaging software to choose from.After studying Linux Socket network programming, and UI programming knowledge, this paper designs for instant messaging system which is based on Linux C/S mode, and Linux C language development, using GTK graphical interface, relating to TCP / IP and POP / SMTP protocol for chat, recording chats,sending an e-mail, sending the file. So it fills the national electronic information products localization in Instant Messaging System gaps.

Information security; Kylin operating system; Liunx; Instant messaging system

TP311.52

A

10.3969/j.issn.1003-6970.2017.02.006

山西省软科学研究计划项目(2014041049-1);大同市软科学研究计划项目(2014112-2)

赵向兵(1978-),男,讲师,主要研究方向:数据挖掘、大数据。张景安(1970-),男,教授,主要研究方向:云计算、计算机网络应用技术。

本文著录格式:赵向兵,张景安. Linux平台即时通信系统的研究与开发[J]. 软件,2017,38(2):23-27

猜你喜欢

线程好友按钮
属羊
浅谈linux多线程协作
基于上下文定界的Fork/Join并行性的并发程序可达性分析*
Linux线程实现技术研究
么移动中间件线程池并发机制优化改进
雪花特快专递