应用系统开发实践报告
企业内部通信系统
课题名称:基于Java的企业内部通信系统开发 应用环境:企业内部局域网
开发时间:2012年4月—2012年6月 专业班级: 姓 名: 指导老师:
中国矿业大学计算机科学与技术学院
2012 年 4月 7日
中 国 矿 业 大 学
摘 要
随着个人PC的快速发展和计算机网络的广泛应用,计算机正在我们生活中发挥这越来越大的作用,计算机的发展改变了我们的生活,人们已经越来越离不开它,对其的依赖性日益增长。
互联网把世界各个角落连接起来,地球村的概念正在人们脑中形成,虽然地球“变小”了,但是仍有一些地方是我们无法看到、触摸到的,比如银行、国防系统等。此外,有些较小型的企业为了减少成本,不会为每台电脑都接通互联网,那么他们如何利用电脑实现快速通信交流呢?
本系统是应用于局域网内,基于Java而设计开发的企业内部通信系统。系统可以实现信息通信、文件传输、系统设置、资源共享、访问公共资源五大功能,其界面友好、操作简单、通用性强、成本较低,可以大大提高企业的工作效率。 关键字:互联网; 企业; 局域网; Java; 信息通信。
中 国 矿 业 大 学
Abstract
With the rapid development of individual PC and the wide application of computer network, computers are playing more and more important roles in our life. The development of the computer changed our life.Nowdays,people have more and more without computers.
Along with the high-speed development of the computer network technology, various of applications based on network was born, like information releasing, data sharing ... The development of the LAN is the same fast. Some governments, enterprises and schools constitute a LAN first ,then join into INTERNET.
So the instant messenger in LAN was borned. So I make a new design, and implement it on WINDOWS platform. In my implementation the client and the server were integrated in one program with multi thread mechanism. And had a good GUI,it was very easy to use it. And the function is very realizable. At last, it is also easy for expanding. Keywords:Internet; Business; LAN; Java; Message
中 国 矿 业 大 学
目 录
1 引 言 ...............................................4 1.1 课题背景及意义: ................................4 1.2 课题现状 .......................................5 1.3 本文的主要工作: ................................6 1.4开发平台与技术的选择及介绍 ........................6 1.4.1 开发环境的介绍 ............................6 1.4.2 WINDOWS SOCKETS网络编程接口概述 ...........6 2 需求分析及可行性研究 .................错误!未定义书签。 2.1 可行性分析: ....................错误!未定义书签。 2.1.1 技术可行性分析 .............错误!未定义书签。 2.1.2 经济可行性分析 .............错误!未定义书签。 2.1.3 操作可行性分析 .............错误!未定义书签。 2.2 用户需求: .................................................................. 错误!未定义书签。 2.3 功能需求: ......................错误!未定义书签。 2.3.1 信息通讯功能 ...............错误!未定义书签。 2.3.2 系统设置功能 ...............错误!未定义书签。 2.3.3 文件传输功能 ...............错误!未定义书签。 2.3.4 资源共享功能 ...............错误!未定义书签。 2.3.5 访问公共资源 ...............错误!未定义书签。 2.4 系统数据库分析: ................错误!未定义书签。 2.5 系统用例图: ............................................................. 错误!未定义书签。 3 相关开发技术的原理性说明 ...................................错误!未定义书签。 3.1 TCP/IP 协议及WINDOWS SOCKETS网络编程接口 .......15 3.2.1 TCP/IP协议简介 ...........................15 3.2.2 WINDOWS SOCKETS网络编程接口概述 ..........16 3.2 多线程编程技术 .................................17 3.3.1 进程及线程概述 ............................17 3.3.2 Win32 API对多线程编程的支持 ..............17 4 详细设计 .............................错误!未定义书签。 4.1体系结构设计 .....................错误!未定义书签。 4.2 功能模块划分 ....................错误!未定义书签。 4.3 数据结构设计 ....................错误!未定义书签。 4.4 用户界面设计 ....................错误!未定义书签。 4.4.1 服务器端显示界面: .........错误!未定义书签。 4.4.2 客户端显示界面:.................................... 错误!未定义书签。 6 测 试 ..............................错误!未定义书签。 结 论 .................................错误!未定义书签。
中 国 矿 业 大 学
致 谢 .................................错误!未定义书签。 参考文献 ..............................错误!未定义书签。
1.1 课题背景及意义
引 言
1
中 国 矿 业 大 学
近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,在局域网上运行的应用越来越多,如知识库、网络会议、数据库应用和数据的同步与备份等,这些应用对局域网的信息吞吐、处理能力的要求也越来越高。这些在企业内部原有局域网设计之初未曾考虑到的新情况的出现使得局域网不堪重负,容易发生信息阻塞,此时,局域网不但不能提高生产效率,反而成为企业发展的瓶颈。
为了解决上述矛盾,人们提出了许多方法。提升网络带宽及增加服务器的吞吐能力是解决此矛盾的一种方法。然而,从企业运行的成本方面考虑,无论是单纯地提升网络带宽或增加服务器的吞吐能力都不能从根本上解决局域网资源紧张的问题,对旧有局域网的大规模硬件改造反而会增加企业的负担。
我在本文中将讨论一种基于Socket的局域网通信工具的设计与实现方法。基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。
基于Socket的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。
基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。
1.2 课题现状
基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用UDP或者 TCP协议体系来实现 ,开发技术已经比较成熟,比如较早的ICQ,MSN Messanger,Yahoo 通这些国外开发的产品,还有国产的有名的QQ,新浪UC,LAVA-LAVA等,这些工具统统都实现了广域网上的即时通信,尽管都是即时通信,实现了即时聊天,以及文件传输的主要功能,但是也各有各的特色,比如ICQ的巨大客户群,MSN的个性化表情,YAHOO通的易操作性等。而QQ也具有一个相当方便的屏幕截图功能,另外就是,所有上述软件都实现了网络即时的视频,语音聊天功能。这些软件,在使用方面各有特色,在实现方面也各有所长,但基于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层TCP/IP,或者UDP/IP协议的软件产品。在局域网内,这些功能的实现跟广域网相比更加简单,因为局域网的网络结构本身比广域网要复杂,但是又可以借些理解网
中 国 矿 业 大 学
络协议,以及网络通信工具的实现原理,所以仍然极具研究价值。
1.3 本文的主要工作:
本文主要工作是设计一个基于WINDOWS平台的局域网即时聊天工具,然后阐述本软件的功能、特点及使用方法,并详细阐述开发本软件所用的相关技术,具体分析本软件的各个模块的功能及实现方法,说明本软件的设计思想及方法。
1.4开发平台与技术的选择及介绍
1.4.1 开发环境的介绍
我所设计的是一个面向中小型机构内部通信需求的局域网即时信息软件,要在短时间内开发出来并且要满足客户要求,无论是硬件还是软件都要选择合适,要求如下:开发设备应该完备;开发机器的性能必须稳定;操作系统的选择必须恬当;开发出的程序可以在尽可能多的平台上运行;要求运行机配置尽可能低档。对此,我们选择的硬件环境和软件环境如下: (1) 硬件环境
开发该系统应尽可能采用高档的硬件。因此,在应用时应采用更好的配置。 处理器:Intel Pentium PIII或更高处理器。 内存:128MB或更高。 网络:局域网。 (2) 软件环境
选择好的操作系统和好的编程语言是系统优劣的关键,我们要求系统在尽可能多的环境下运行,故选择Windows XP平台,对于一些无法在98中运行的API函数,一律不采用,并采取优化的算法编写程序。因JAVA具有友好的集成开发界面、面向对象的可视化开发模式、良好的数据库及多媒体应用支持以及高效的软件开发与程序运行,功能更大,开发效率更高,不仅是网络环境下的优秀前端开发语言和工具,也是服务器端Web编程的优秀工具。加之我本人对本系统的操作最为熟练,所以选择该平台为开发环境。
操作系统:Windows XP或Window2000。 开发工具:Java Eclipse
1.4.2 WINDOWS SOCKETS网络编程接口概述
既然选定了WINDOWS平台,而又要开发网络通信程序,所以可以选择WINDOWS的SOCKETS编程接口,Windows Sockets是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Winsockets无疑是我们进行网络编程的利器。
中 国 矿 业 大 学
2 需求分析及可行性研究
中 国 矿 业 大 学
为了设计一个更好更出色的应用系统,我们必须做好先前的需求分析工作,只有做好这一项工作,我们才能清楚该开发一个什么样的系统,系统该如何开发,开发出来是否能够得到认可和应用。鉴于此,我们对企业内部通信系统进行需求分析,主要从三个方面展开,分别是:用户需求、功能需求、可行性分析等方面进行。
2.1可行性分析
2.1.1、技术可行性分析
局域网通信系统技术已经非常成熟,从硬件上讲,足以满足要求。从软件角度考虑,数据库技术的应用也很成熟,处理能力非常强。同时,Java开发图形界面程序已经相当普遍,本系统开发语言为Java,所用数据库为JavaDB。有了这些技术支撑,开发一个通信系统是可行的。
2.1.2、经济可行性分析
本系统开发完成后可以提高员工的工作效率,减少企业工作期间通信的时间及金钱开销,且开发成本低廉,企业配备此系统也不需要对员工进行培训,简单易用,容易接受。经过多方考虑,无论是成本还是对日后公司发展的利处,经济方面都是可行的。 2.1.3、操作可行性分析
本系统要求用户有基本的计算机操作技能,能够对体统进行熟练正确的操作。由于本系统占用空间小,简单便捷,所以对计算机的硬件要求很低,至于系统,windowsXP就可以很顺利的运行。
2.2用户需求
如今,网络和全球信息化速度不断加快,然而大多数网络通信都需要接入到全球互联网,比如MSN、QQ、飞信等等。这些工具的广泛应用,确实给我们带来了很多便利,然而有些大公司接入互联网会带来很多问题,最严重的就是内部信息的泄漏以及黑客的攻击。受飞鸽传书软件的启发,我们想开发一款在局域网内进行通信的软件,要求这款软件必须具备QQ等即时通信、方便快捷的优点,同时还要实现局域网内所有用户的互联。
为了简化软件,便捷好用,本系统省去了登录环节。员工只要运行软件,便可以快速的与同事、领导进行交流。同时,本系统也不需要设计得像QQ等软件那么复杂,不需要开设个人空间,只要能够高效得实现即时通信、文件传输、资源共享等有用功能即可。总之,我们的开发理念是越简单越好,越稳定越好,越安全越好。
2.3功能需求
本系统设计的目标是实现一个企业内部局域网的通信系统,使企业内部员工可以方便的进行交流,大大提高职工工作效率。根据需求,本系统主要包括信息通讯、系统设置、资源共享、访问公共资源、文件传送五大功能。同时,对于每一个用户,可以管理个人的信息,以及更改好友的名称等。由于一个企业分为很多部门,考虑到讨论问题在部门内进行比较合理,本系统可以设置几个大的群,各部门的员工分别加入自己的群,每个群设若干管理员,每名员工可以到指定的群里进行交流沟通。
五大功能是本系统开发的核心,这五个功能能否很好的在计算机上实现,直接说明了本系统的开发是否成功。下面,我们对这五个重要的功能进行简单的描述。 2.3.1信息通讯功能
中 国 矿 业 大 学
实现信息通讯,是该系统的核心功能。它主要用于各员工之间进行即时的通信,就如我们生活中的QQ聊天一样,员工可以和在线的任意一个同时进行点对点的即时通信。由于我们利用客户端在局域网内通信,所以速度非常快,要比短信的效率高很多。 2.3.2系统设置功能
为了满足员工的喜好及个性化,该软件可以进行系统设置。比如用户界面风格、个人公告、来信提示音等。个人公告可以被同事客户端所见,这样同事就可以知道此时是否方便可以聊天。
2.3.3文件传输功能
由于所有电脑是接入局域网的,所以计算机之间的文件传输速度是很快的,故实现这个功能对本系统来说非常实用。用户只要在聊天窗口,就可以把文件直接传输到对方的电脑上。 2.3.4资源共享功能
有时候同事有很多文件我们很需要,然而同事并不知道你具体需要哪些文件,这时,只要同事对你开放权限可以共享他电脑中的资源,用户就可以自己访问同事的资源,直接拷贝自己需要的文件。 2.3.5访问公共资源功能
有一些企业内部的文件是所有员工都用得到的,然而如果存放于每一台计算机中,显然会浪费很大的空间。公司可以置几台性能好的计算机用来存放企业日常文件,并有专门的管理员管理,同样也安装通信软件,不同的是,这些计算机上的资源必须对所有相关用户时时共享。
除了这五个主要功能外,系统必须进行一些实用、人性化的设计,我们必须要考虑到企业的具体要求。比如有些企业为了防止员工把大量时间花费在聊天上,我们可以设计一个限时功能。
2.4系统数据库分析
本系统是一个桌面系统,数据库与应用系统存在于同一计算机上,且应用系统用到的数据库规模较小,所以我们采用JavaDB数据库,这样便大大的节省了开销,同时提高了系统的安全性。该系统数据库主要包括用户实体和聊天窗口绝对位置实体。用户实体的属性有:IP地址、用户名称、主机名称等。通信窗口位置实体的属性有:窗体位置横坐标和竖坐标、窗口的高度和宽度。E-R图如图1、图2所示。
IP地址 用户名称 用户 主机名称 用户资料 头像
图1:用户实体E-R图
窗口
中 国 矿 业 大 学
X坐标 Y坐标 窗体高度 窗体宽度 状态(显示、隐藏) 图2:窗口实体E-R图
2.5系统用例图
用例视图被称为参与者的外部用户所能观察到的系统功能的模型图。用例是系统中一个
功能单元,可以被描述为参与者与系统之间的一次交互。
企业内部通信系统中,参与者主要的活动有:
1、 员工向同事发送信息或者传输文件;
2、 员工接收同事信息或者接收同事传给的文件; 3、 员工访问同事共享的资源; 4、 员工访问企业公共资源; 5、 员工对系统进行设置。
系统的整体用例图如图3所示。
发送信息传输/接收文件设置系统员工1员工2访问公共资源访问同事
图3:系统整体用例图
3 概要设计
上面一章,我们对企业内部通信系统做了比较全面的需求分析。为了更好的实现用户的需求以及系统的功能,我们要对系统做总体的概要设计,勾勒出整个系统的基本框架。概要
中 国 矿 业 大 学
设计的做好与否,直接关系到我们后期详细设计的工作。本章概要设计中,我们主要分为如下几个内容:体系结构设计、系统功能模块设计、系统界面窗口设计以及数据结构设计等内容。同时,为了更直观详细的描述系统的内部结构,我们需画出企业内部通信系统的类图和对象图。
3.1体系结构设计
通常的通信工具都采用了C/S即客户机/服务器的体系结构,比如我们生活中用到的QQ聊天软件。然而本系统的开发初衷是尽量的节约小型企业的通信成本,C/S模式固然在速度、数据处理与保存上占有很大的优势,但这些并不是本系统所需求的。因此,企业内部通信系统不采用C/S模式,我们只采用局域网内点对点通信的模式,在这儿我们简称为P2P。如果企业规模很小,我们用路由器便可实现计算机的互联;如果企业规模比较大,我们用交换机来实现。为了提高通信的速度,局域网的连接方式采用星型局域网。
如果企业规模很大,采用C/S模式,这时要用到服务器。有了服务器,系统可以增加一个新的功能——公共资源访问。
3.2系统模块设计
为了更好的实现系统软件的各个功能,我们对软件进行模块化划分,每个模块实现相应的功能。在模块划分时,一定要覆盖所有系统欲实现的功能,同时,模块间的耦合度要合适。
企业内部通信系统共分为如下模块:主窗体模块、公共模块、系统托盘模块、系统工具模块、用户管理模块、通信模块六大模块。模块划分图如图2.1。
企业内部通信系统 主 窗 体 模 块 公 共 模 块 系统托盘模块 系统工具模块 用户管理模块 通信模块
图2.1 企业内部通信系统模块划分图
各模块所实现的功能如下
主窗体模块:主窗体是用户操作软件的直接界面,用来显示好友列表、公告提示、系统选项按钮等。在主窗体上,我们可以直观得看到好友相关信息,选择在线的好友进行即时通信。
公共模块:系统运行过程中,一些模块可能要同时调用某些配置信息,为了节约空间,避免重复,我们把公用的东西放到一个模块中,以便各模块的调用。
中 国 矿 业 大 学
系统托盘模块:此模块用于定义系统栏图标。企业内部通信系统的主窗体是继承对话框窗体编写的,该窗体在系统任务栏不会显示相应任务标题,主窗体最小化会隐蔽,此时要使用快捷键或者鼠标操作执行显示主窗体的命令。
系统工具模块:工具模块中主要有一些用户必须用到的工具,比如搜索用户、更换皮肤、系统升级等。用户搜索可以找到局域网内正在应用的计算机。
用户管理模块:此模块用于管理用户好友的信息,比如修改备注名称、添加/删除好友、访问共享资源等。这些操作都是在主窗体上进行的。
通信模块:此模块是企业内部通信系统最关键的模块,是核心模块,一切模块都是围绕通信模块设计的。此模块用于用户之间发送和接受信息。
3.3数据库设计
在需求分析中,我们对系统用到的数据库进行简单分析,本系统用到的数据库并不复杂,只有用户信息和窗体位置两个实体,因此我们不采用外界的数据库开发系统,直接用JavaDB来实现。
设计两个表,分别为用户信息表和窗体位置信息表,如表2.1和表2.2所示。
字段名 ip host name tooltip icon 数据类型 Varchar(16) Varchar(30) Varchar(20) Varchar(50) Varchar(50) 表2.1 用户信息表 是否为空 是否主键 No Yes Yes No Yes No Yes No Yes No 默认值 NULL NULL NULL NULL 描述 用户IP地址 主机名称 姓名 提示文本 头像 字段名 xLocation yLocation Width Height 数据类型 Int Int Int Int 表2.2 窗体位置信息表 是否为空 是否主键 Yes No Yes No Yes No Yes No 默认值 Null Null Null Null 描述 X轴坐标 Y轴坐标 窗体宽度 窗体高度 3.4系统框架结构设计
我们知道,一个系统的功能实现是由各个模块儿相互配合共同完成的,因此我们要为各模块建立一个框架关系,使各模块协调执行,建立一个结构清晰、便于后期维护的系统。
在一个系统中,大多数的模块性比较强,同一时刻可以同时运行多个模块实现多个功能。然而,在实现一个整体的任务时,各模块有先后运行的顺序,并且相互调用。在企业内部通信系统中,若是要实现一个通信的操作,我们首先要通过主窗体模块来展现目前系统的状态,然后用用户管理模块选择接收信息的用户和填写信息,最后通过通信模块把信息传送给对方。因此这三个模块执行顺序为:主窗体模块、用户管理模块、通信模块。企业内部通信系统的框架结构图如图2.2所示。
中 国 矿 业 大 学
系统托盘模块 公共模块 PC1 主窗体模块 用户管理模块 通信模块 系统工具模块 系统托盘模块 公共模块 PC2 主窗体模块 用户管理模块 通信模块 系统工具模块
图2.2 系统框架结构图
3.5系统类的设计
在编写系统程序之前,我们要为系统确定详细的类,以及类与类之间的调用关系。企业内部通信系统的类图如图2.3所示。
中 国 矿 业 大 学
用户面板控件类数据库操作类+状态+空间大小+名称+添加窗体信息()+读出窗体信息()+修改窗体信息()+创建默认用户()+添加用户信息()+删除用户信息()+获取用户信息()+更新窗体信息()+更新用户信息()+接收图标参数()+获取主窗体信息()+初始化图标信息()主窗体类+窗体大小+窗体位置+窗体状态+窗体界面+公告信息检测()+用户信息初始化()+进入主程序()+记录窗口信息()+初始化系统托盘()+系统栏图标菜单()+双击时间()+创建工具选项卡()+创建界面选择部分()+创建用户搜索部分()+创建系统操作部分()聊天控件类+添加并显示用户列表()+删除选中的用户对象()+添加新用户()系统更新事件类+登录升级服务器()发送事件类+处理按钮事件()+获取通信信息()系统工具类+工具状态+工具名称+工具用途+搜索用户()+升级服务器()+发送信使()+打开文件夹及网络共享资源()搜索用户时间类+搜索指定范围用户()通信类+获取窗体()+接收信息()信使事件类+处理按钮事件()+发送信使信息()图2.3 企业内部通信系统类图
对类图的进行分解,了解他们各自的功能和调用的实现。下面列举主要的类以及类中重要的函数和调用关系。
(1) 主窗体类:此类包含窗体大小、位置、界面和状态等属性。
公告信息函数用于检测系统的公告信息,当系统中存在公告时,则提取公告文件,显示于公告栏中。
用户信息初始化函数,用于初始化第一次使用本系统的本地用户信息,包括头像、名称都使用默认值。
进入主程序函数首先获取用户设置的系统信息,然后调用用户面板控件类的获取主窗体信息函数,生成主窗体对象。
记录窗体信息类调用数据库操作中的更新窗体信息函数,把窗体信息记录到数据库中。
(2) 数据库操作类:此类包含名称、大小、状态等属性。
添加、删除窗体信息函数用于添加或者删除窗体位置和大小信息到数据库。 添加、删除用户信息用于添加或者删除用户的基本信息到数据库中。
更新窗体、用户信息用于把用户更改的信息同步更新到数据库中。
(3) 系统工具类:此类包括工具名称、工具用途和工具状态等信息。
搜索用户函数用于搜索局域网中的通信用户。 发送信使函数用于把信使发送到指定的用户。 (4) 通信类
处理发送按钮事件函数拥有处理按钮事件的函数。
中 国 矿 业 大 学
3 相关开发技术的原理说明
3.1 TCP/IP 协议及WINDOWS SOCKETS网络编程接口
3.1.1 TCP/IP协议简介 (1)TCP/IP协议
通常包含了一系列与“TCP(传输控制协议)”和“IP(网际协议)”有联系的网络协议,它包括其它的协议,应用软件,甚至网络媒介。这些协议的示例是:UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议、ARP(地址解析协议)和其他一些协议的协议组。应用的示例:telnet(远程登录)、ftp(文件传递协议)、http等。
(2)逻辑结构:
图3-3 逻辑结构
这是TCP/IP协议的分层结构在互连网计算机上的表示,用互连网技术互相通信的每台计算机都有这样的分层结构。这样的分层结构决定了计算机在internet上互相通信的方式。数据通过这样的分层结构从上层传到底层,然后通过网线把数据传送出去。底层的水平线代表以太网网线,“O”代表收发器,“*”代表IP地址,“@”代表网址,理解这样的分层结构是理解INTERNET技术的基础。
(3)本论文涉及到的协议:IP、TCP
IP(Internet Protocol)是TCP/IP的心脏,也是网络层中最重要的协议。 IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
UDP(IP协议号17)是一个无连接的数据报协议。它是一个“best effort”或者“不可靠”协议——不是因为它特别不可靠,而是因为它不检查数据包是否已经到达目的地,并且
中 国 矿 业 大 学
不保证它们按顺序到达。UDP的典型性应用是如流媒体(音频和视频等)这样按时到达比可靠性更重要的应用,或者如DNS查找这样的简单查询/响应应用,如果需要建立可靠的连结,哪么所作的额外工作将是不成比例地大。本程序只应用于局域网中,局域网中的数据流传输的可靠性高,故选择UDP协议。
3.1.2 WINDOWS SOCKETS网络编程接口概述
在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被\"惊醒\"并且为客户提供服务-对客户的请求作出适当的反应。
为了方便这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。
Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。如下图所示:
图3-4 面向连接的套接字的系统调用图
微软为Visual C++定义了Winsock类如CAsyncSocket类和派生于CAsyncSocket 的CSocket类,它们简单易用,我们当然可以使用这些类来实现自己的网络程序,但是为了更好的了解Winsock API编程技术,本设计中将使用底层的API函数实现 Winsock 平台的即时通信工具。
中 国 矿 业 大 学
在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面的三个文件,否则会出现编译错误。
(1) WINSOCK.H: 这是WINSOCK API的头文件,需要包含在项目中。 (2) WSOCK32.LIB: WINSOCK API连接库文件。
(3) WINSOCK.DLL: WINSOCK的动态连接库,位于WINDOWS的安装目录下。
3.2 多线程编程技术
3.2.1 进程及线程概述
进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。
线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。
每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。
Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。
3.2.2 Win32 API对多线程编程的支持
Win32 提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行说明。
(1) HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。 (2) DWORD SuspendThread(HANDLE hThread);
该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
中 国 矿 业 大 学
(3) DWORD ResumeThread(HANDLE hThread);
该函数用于结束线程的挂起状态,执行线程。 (4) VOID ExitThread(DWORD dwExitCode);
该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。
(5) BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。
使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。
(6)BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);
该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。
调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。
中 国 矿 业 大 学
4 详细设计
在概要设计中,我们把整个系统划分为五个模块,其中每个模块都实现有一些特定的功能。在详细设计中,我们要对系统的每个模块进行详细的分析和设计,最终编写出代码。
4.1主窗体的设计
主窗体界面由用户列表、公告提示、系统选项卡等组成。其中系统选项卡用于切换不同管理界面。当系统最小化后,应当在工具栏中显示软件图标,所以主窗体类中要加上系统托盘模块的方法。主窗体界面图如图3.1所示。
(1) 继承JDialog创建EQ类,在类体中创建主窗体用到的各种控件工具以及数据库操作类
的成员变量。
(2) 定义一个EQ构造方法,在构造方法中初始化窗体上的控件、数据库操作类、首选项对
象等属性,另外还要为窗体添加时间、为公告栏信息按钮添加事件等。
(3) 本软件使用端口为1111,在对Socket服务器初始化时,如果初始化失败,提示用户
服务器端口已经被占用或者本软件正在运行,并退出程序。这个步骤很关键,如果没有确定端口,本软件将无法接受对方发来的信息。
(4) 定义checkPlacard()方法,此方法用于检测系统公告信息,当公告路径中存在公告信
息时,此方法将从公告文件中获取完整信息,然后调用pushMessage()方法将公告信息压入公告信息栈中。
(5) 定义initUserInfoBotton()方法,此方法用于初始化本地信息,并在主窗体左上角显
示本地用户的头像和名称;在用户更改本地用户名称时,他会同步更新。
(6) 定义main方法,此方法是主程序的入口方法。在该方法中,首先获取用户设置的界面
外观,其中包括“当前系统”和“JAVA默认”两种外观,然后调用UIManager类的setLookAndFeel()方法设置指定的外观,并生成主窗体对象。最后初始化服务器端口和系统栏图标。
中 国 矿 业 大 学
(7) 定义savalocation()方法,当窗体检测器检测到窗体位置及大小变化使,调用此方法,
此方法调用Dao数据库操作类的updateLocation()方法将窗体位置和窗体大小信息保存到数据库中。
系统托盘设计中的方法:
(8) 定义SystemTrayInitial()方法,该方法用于初始化系统的托盘。在该方法中,主要
是初始化系统托盘中的提示文本、系统栏图标,然后调用createMenu()方法为系统栏图标创建弹出菜单,同时为系统栏添加SysTrayActionListener类事件。
(9) 定义createMenu()方法,上面提到,该方法用于创建系统栏图标的弹出菜单,该菜单
包括“打开”、“访问服务器”和“退出”3个菜单项和菜单项分隔符。当用户选择打开菜单项时,将显示企业内部通信系统的主窗体;选择“访问服务器”菜单项之后,将打开公共程序资源。另外,主窗体没有提供退出功能,退出程序必须通过托盘图标右击菜单中“退出”选项。
(10)定义SysTrayActionListener内部类,他实现了ActionListener接口,是系统栏图标
的双击时间,在用户双击系统栏图标之后,该将实现主窗体的显示。这和系统栏图标的“打开”菜单项所实现的功能相同,但是双击系统栏图标会更加方便。
系统工具设计的方法:
企业内部通信系统的系统工具起到维护系统的作用,包括用户搜索、外观设置、系统升级三个功能。在系统第一次运行时,用户搜索功能可以搜索局域网内正在运行软件的计算机,并使用计算机的信息创建相应的用户对象,然后将对象保存到数据库中。在企业内部通信系统升级时,可以使用升级功能升级到最新版本。
中 国 矿 业 大 学
(11)定义createSysToolPanel()方法,用于创新系统工具选项卡。在选项卡中,包括界面
选择、用户搜索和系统升级三个部分,他们都倍添加到系统工具面板中,createSysToolPanel()方法必须设置好该面板的布局和初始化工作,使得用户界面更友好。在createSysToolPanel()方法中,该方法用来创建界面选择部分,该部分以列表控件显示了两种外观选项,当用户选择其中一种外观并单击“确定”按钮之后,选择的外观会保存到首选项中,然后提示用户重新运行本软件。在createSysToolPanel()方法中,该方法创建了用户搜索部分,包括搜索列表、搜索进度条和搜索新用户按钮3个控件。当单击“搜索新用户”按钮时,系统会根据用户在系统设置界面所设置的IP搜索范围搜索所有计算机信息,并创建对应的用户对象,然后保存到数据库中。在createSysToolPanel()方法中创建系统升级部分,该部分包括“系统升级”按钮和显示程序跟新信息的标签控件。当用户单击“系统升级”按钮时,该按钮的事件会下载当前最新版本,然后跟新相应的标签控件提示用户更新信息。
(12)为了实现上诉方法中按钮的一些功能,在主类中创建了一些事件的内部类,包
括创建搜索用户按钮的SearchUserActionListener类和创建系统升级按钮的SysUpdateListener类。
(13)定义updateProject()方法,在该方法中分别创建本地程序和服务器最新程序文件对
象,然后解析两个文件的最后修改日期,如果服务器程序的最后修改日期比本地程序更新,那么获取服务器文件的内容并更新到本地文件中。
4.2数据库的设计
本系统需要设计一个数据库,由于数据库的规模比较小,采用其它数据库软件的话只会加大系统开发的难度,因此本系统采用了JAVADB数据库,很好的实现了这一功能。
首先创建一个数据库类,主要负责数据库的一些操作。类中构造方法驱动并连接数据库,并将其设置为Private,通过静态的getDao()方法获取Dao类的实例对象,这是典型的单例模式。在连接数据库时,可以指定create参数为true直接创建数据库,但在此之前需要调用dbExists()方法判断数据库是否存在。
(1) 定义addDefLocation()方法,该方法用于添加窗体初始化时默认的位置和大小到数
据库中。在企业内部通信系统首次运行时,将使用该方法设置窗体位置和窗体大小。如果用户更改了窗体的位置或者窗体的大小,该方法所保存的默认数据将不再起作用,知道软件下次被启动。
(2) 定义addDefUser()方法,该方法使用本机IP地址创建默认用户,并且添加到数据库
中。除了使用本机IP地址外,默认的用户还包括主机名称、姓名、提示文本和头像图标等属性。
(3) 定义getLocation()方法,此方法用于从数据库中获取窗体的位置和大小信息,并将
这些信息作为方法的返回值,作用与主窗体界面。
(4) 定义addUser()方法,此方法用于添加制定用户到数据库中,通过这个方法接受User
类的实例对象,以用户对象作为参数,在SQL语句中将用户对象的属性作为参数插入到数据库中。
(5) 定义delUser()方法,该方法用于从数据库中删除制定用户的记录。该方法通过接受
User类的实例对象参数,并以该用户对象的IP属性为查询条件,从数据库中删除指定ip的用户信息。
(6) 定义getUser()方法,该方法用于数据库中获取指定ip的用户对象,该用户对象包含
了指定ip地址的用户的所有属性,并且将这些属性封装到用户对象中,然后作为方法返回值。
(7) 定义updateLocation()方法,该方法用户更新窗体位置和窗体大小的信息。该方法接
受Rectangle类的实例对象作为参数,将位置、宽度和高度等参数保存到数据库中。
中 国 矿 业 大 学
4.3系统工具的设计
要实现系统见的相互通信,不仅仅要有通信功能,还必须添加一些小功能来使软件更人性化,用起来更方便。本系统为用户提供了四个基本工具,分别是:用户搜索工具、公共资源访问工具、群发信使工具、单信息发送工具。
首先创建Resource类,然后在类中定义上诉的方法。
(1) 定义searchUsers()方法,该方法用于索索局域网中的通信用户。用户通过指定要搜
索的ip地址,系统会在该范围内自动搜索正在使用的用户。
(2) 定义loginPublic()方法,该方法用于登陆程序升级服务器,他获取用户指定的升级
路径、用户名和密码,使用“net use”命令访问服务器。
(3) 定义sendMessenger()方法,该方法用于发送信使到指定用户的操作系统,当通信对
方没有运行企业内部通信系统时,就无法接受到通信系统发送的内容,这时可以调用该方法向对方发送信使,对方也会接收到信使之后会以对话框的通知方式显示信使内容。
(4) 定义sendGroupMessenger()方法,该方法可以向指定用户群发信使。
(5) 定义startFolder()方法,该方法用于打开指定的文件夹或者网络共享资源。
4.4用户管理设计
用户管理模块类似于聊天软件的好友列表,其中包含所有用户信息;另外,在用户名上有机鼠标,在弹出的快捷菜单中提供了“更名”、“添加用户”、“删除用户”、“信使群发”、“访问主机资源”、“访问公共程序”功能。其中访问主机资源是指访问所选用户的共享文件。用户管理模块的运行效果如图所示:
中 国 矿 业 大 学
用户管理模块主要用于显示用户列表,这个列表是使用JTree树控件实现的。JTree控件的树节点默认的界面效果难以满足用户列表的外观要求,用户列表需要绘制当前选择用户的边框、头像、状态图标等信息。为提高用户列表的美观性,用户管理模块必须实现TreeCellRenderer接口,创建显示自定义图标的属单元格渲染器,这样就可以自定义树节点的样式了。
用户管理模块实现过程是通过UserTreeRanderer类、ChatTree类来实现的。UserTreeRanderer类继承了JPanel类,在类中定义了getTreeCellRendererComponent()方法;ChatTree类继承JTree类实现自定义的树控件,在类中定义了sortUsers()方法、delUser()方法、addUser()方法等。
(1)在UserTreeRanderer类中定义getTreeCellRendererCom
ponent()方法,它负责渲染树节点的界面样式。该方法将获取主窗体的宽度,并使用该宽度值设置节点的宽度,使节点与窗体同宽。当用户选择某个节点时,该方法将使用指定颜色绘制结点的边框,以突出该节点被选择的效果。
(2)在ChatTree类中定义sortUsers()方法。该方法的主体是一个内部线程,该线程首先
获取本地的IP地址。使用该地址从数据库中获取本地用户对象,并将本地用户显示在用户列表首位。然后,从数据库中获取所有用户对象,将除自己以外的用户分别添加到用户列表中。最后,使第一个用户出于被选择状态,并更新状态栏标签中显示的用户数量。
(3)在ChatTree类中定义delUser()方法,用于删除当前用户列表中选择的用户对象。该
方法首先获取选择的树节点,从该节点中获取绑定的用户对象,然后以对话框提示用户是否确认删除,如果经过用户确认,将调用delUser()方法从数据库中删除用户信息,最后调用根节点的remove()方法删除该用户节点。
(4)在ChatTree类中定义addUser()方法,用于添加自己指定IP地址的用户对象。该方法
首先要输入用户指定的IP地址,然后系统在局域网内搜索是否存在该IP地址的用户,如果存在则把用户信息添加到数据库中,如果没有找到则提示“没有该用户”。
4.5通信模块设计
通信模块是企业内部通信系统的核心模块,用于不同职工之间的通信。这种通信方式能够实现多个职工之间的通话,而不存在类似电话的占线问题,增加了任务分配的新方式,从而提高企业的工作效率。该模块可以使用UDP协议和系统信使两种方式发送通信信息。通信界面如图所示:
中 国 矿 业 大 学
通信模块使用基于UDP协议的数据报和套接字实现计算机之间的信息通信。UDP协议就是“用户数据包协议”,是一种无连接协议,在用该协议进行数据传输时,发送方只要知道对方的IP地址和端口号就可以发送数据,并不需要进行连接。当连接的远程主机端口号出于监听状态时,则UDP必须出于连接状态。
通信模块是通过TelFrame类实现的,该类中定义了getInstance()方法、receiveInfo()方法。在TelFrame类中还定义了sendActionListener类、MessageButtonActionListener类,这两个类都是内部类。
(1) 定义getInstance()方法,用于获取唯一的窗体实例。该方法创建的所有窗体实例都
会保存到Map集合类的实例中,除非退出企业内部通信系统,否则窗体的实例对象会一直保存在这个集合类中,并且用户在此打开已存在的窗体时,将直接从集合类中获取,不再创建新的窗体实例。
(2) 定义receiveInfo()方法,用于接收其他用户发送的通信信息。该方法首先从数据中
获取发送信息的用户IP地址,然后从数据库中获取该IP用户的姓名、同时将这些用户IP、用户姓名和发送时间以蓝色字体显示到信息文本框中,最后将数据报中通信信息文本追加到信息文本框中。
(3) 创建“发送”按钮的事件sendActionListener类,这是一个内部类,并且该类
实现了ActionListener接口,拥有处理按钮事件的能力。它在actionPerformed()方法中获取数据报中的通信信息。
(4) 创建MessageButtonActionListener类,这也是一个内部类,该类是信使按钮的事件
。当用户输入通信信息,并单击“信使”按钮时,该事件的actionPerformed()方法会调用Resource工具类的sendMessage()方法将通信信息以系统信使方式发送到对方计算机。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务