[计算机毕设]基于java的网络通信系统设计与实现(项目报告+源代码+开题报告)

项目说明报告

JAVA网络通信系统的研究与开发

网络通信在当今信息社会中起着不可或缺的作用 ,人们可以利用网络通信技术进行即时的信息交流。例如,人们可以通过Internet搜索所要的信息,通过网上通信工具聊天,交流信息,上网购物等等。

本课题是应用了计算机网络通信技术和JAVA网络编程的基础知识,以JAVA为平台,利用Eclipse开发工具,并使用SQL Server 管理数据库数据开发出的基于Socket的网络即时通信系统。系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的通信开销。此系统共分为两个模块:客户端模块和服务器端模块。从操作简便、界面美观、灵活实用的用户要求出发,设计开发的网络通信系统可以实现用户注册,用户登录,消息通信和好友管理等主要功能。

本说明书主要介绍了本课题的研究意义以及开发背景、开发过程,和所完成的功能,并着重说明了开发设计的思想、技术难点和解决方案。

网络通信 JAVA平台 C/S  Socket

 

毕业设计(论文)外文摘要

The Design and Implementation of A Java-Based Internet Communication System

Abstract: Communication on Internet is very popular and crucial in people’s live. Using the network communication technology, we can chat with our friends at any time. For instance, we can chat or communicate with friends and our company by some chatting tools; we even can buy everything we want on Internet.

  This system is designed based on computer networking technology and some relative knowledge, using JAVA and SQL SERVER 2,000 database system as tools to develop. This implementation is based on C/S (Client/Server) model. The model can be divided into three levels: Databases levelServer levelClient level. According to this idea, we can distribute the task into two parts: the client and the server. The benefit is that the cost is cut down. From the needs of easy operation, beautiful and vivid interface and practical application, we can design a system which functions is including user registering, user login, adding friend, deleting friend, chatting and so on.

This paper introduces the background of the development, the functions demanded and the process of design. What’s more, the paper focuses on the design principles、implementation details、the key techniques and the solutions.

Keywords: Web application; Java; C/S model; Socket.

目    录

1  引言. 1

1.1 课题的研究现状  1

1.2 课题简介以及设计要求  2

1.2.1课题简介  2

1.2.2课题设计要求  2

1.3 课题的调研  2

1.4 可行性分析  2

1.4.1 可行性分析的目的  2

1.4.2 技术可行性分析  3

1.4.3 经济可行性分析  3

1.4.4 操作可行性分析  3

1.4.5 法律可行性分析  4

1.5 论文各章简介  4

2 系统需求分析. 5

2.1 业务流分析  5

2.2概念结构设计  5

2.3 数据流分析  5

2.4 数据字典  6

2.4.1数据字典  6

2.4.2处理逻辑说明  7

3 系统总体设计. 9

3.1 系统开发的原则. 9

3.1.1 面向用户的观点  9

3.1.2 严格按阶段进行  9

3.1.3 采用系统的观点处理  9

3.1.4采用模块化设计方法  9

3.1.5 整个系统的设计主要采用快速原形法  9

3.2系统总体功能结构设计  10

3.2.1 系统代码设计说明  10

3.2.2 系统设计技术说明  10

3.2.3 系统总体功能结构  12

3.3 系统数据库设计  13

3.4开发环境设计与运行环境设计  14

3.4.1 开发环境设计  14

3.4.2 运行环境设计  15

4 服务器模块设计. 15

4.1 主服务器类设计  15

4.2 多线程ServerThread类的设计  16

4.3 用户注册模块  17

4.4 登录验证模块设计  17

4.4.1登录线程设计  17

4.4.2 通知好友上线模块  18

4.5 好友管理模块  20

4.5.1 查找好友模块  20

4.5.2 查看好友资料模块  20

4.5.3 直接添加好友模块  20

4.5.4 添加好友模块  20

4.5.5 添加好友应答模块  21

4.5.6 删除好友模块  21

4.6 退出下线模块  22

5  客户端模块设计. 23

5.1新用户注册模块  23

5.1.1 注册流程  23

5.1.2 注册事件监听流程  23

5.2 用户登录模块  24

5.2.1 监听登录事件  26

5.2.2 界面设计  27

5.2.3 设计过程中遇到的问题  28

5.3 消息通信模块  29

5.3.1 发送消息  30

5.3.2 监听用户操作消息  32

5.3.3 接收消息  35

5.3.4 发送文件和接收文件模块  36

5.4 好友管理模块  37

5.4.1 查找好友  37

5.4.2 添加好友  38

5.4.3 查看资料  39

5.4.4 删除好友  39

6用户手册. 40

6.1 系统的运行环境  40

6.1.1 硬件要求  40

6.1.2 软件环境  40

6.2 系统的功能简介  40

6.3 系统的运行和操作指南  40

7  系统特色与不足. 42

7.1 系统特色  42

7.2 系统不足  42

7.3 设计收获和心得  42

结  论. 44

致  谢. 45

参 考 文 献. 46

引言

1.1 课题的研究现状

网络通信在当今信息社会中起着不可或缺的作用 ,人们可以利用网络通信技术进行即时的信息交流。比如说QQ聊天工具,它就是利用网络通信技术开发的一款众所周知的网络聊天工具。目前,信息交流是互联网提供的主要内容,网络通信系统有多种实现方式,类似ICQ属于一种点对点的聊天系统;还有一种是基于Socket的集中式聊天系统,这种聊天系统需要登录统一的聊天服务器。

当今主流的聊天工具有QQ,ICQ,MSN Messenger,Yahoo Messenger等,国内最热门的当属QQ,腾讯QQ(OICQ)是由深圳市腾讯计算机系统公司开发的,基于Internet的即时寻呼软件。您可以使用QQ和好友用户进行交流,信息即时发送,即时回复,收发及时、功能全面。此外QQ还具有BP机网上寻呼、聊天室、传输文件、语音邮件、手机短讯服务等功能,QQ不仅仅是虚拟的网络寻呼机,更可与传统的无线寻呼网、GSM移动电话的短消息系统互联,目前QQ和全国多家寻呼台、移动通信公司有业务合作。是国内不可多得的中文网络寻呼机。QQ支持显示朋友在线信息、即时传送信息、即时交谈、即时发送文件和网址。QQ可以在中文Win95/98/NT/2000操作系统下运行,是十分灵活的网络寻呼工具。它会自动检查您是否已联网,如果您的电脑已连入Internet,可以搜索网友、显示在线网友,可以根据QQ号、昵称、姓名、email地址等关键词来查找,找到后可加入到通讯录中。当您的通讯录中的网友在线时,QQ中朋友的头像就会显示在线,根据提示就可以发送信息,如果对方登记了寻呼机或开通了GSM手机短消息,即使离线了,您也可及时将信息传递给您的好友。

MSN Messenger 是微软公司推出的即时消息软件,凭借该软件自身的优秀的性能,目前在国内已经拥有了大量的用户群。使用MSN Messenger可以与他人进行文字聊天,语音对话,视频会议等即时交流,还可以通过此软件来查看联系人是否联机。MSN Messenger 界面简洁,易于使用,是与亲人、朋友、工作伙伴保持紧密联系的绝佳选择。使用您已有一个Email地址,即可注册获得免费的MSN Messenger的登录账号。这是当今网络上最好的两款聊天软件。

作为国内使用率最高的聊天工具,QQ现在一直走娱乐化的路线,外观越来越绚丽,QQ魔法、QQ秀、QQ皮肤让人眼花缭乱,QQ电台、QQ杂志、QQ新闻的内容也都以娱乐为主。聊天的功能已经渐渐淡化,全方问的休闲娱乐才是真正的主题。

日后,聊天软件的发展趋势,不仅仅是以聊天为主要内容了 ,更要集合网络电视电台,邮件的收发,新闻杂志的浏览,个人形象展示,视频传输,音频聊天等等功能。网络通信系统将越来越娱乐化。

1.2 课题简介以及设计要求

1.2.1课题简介

随着人类进入信息社会步伐的加快,计算机网络及其应用得到了飞速的发展,并且成为人们日常生活中的不可或缺的一部分,成为人们有效获取信息和进行娱乐的主要方式之一。例如,人们可以通过Internet搜索所要的信息,通过网上聊天工具聊天,交流心得等等。

本课题就是应用了计算机网络通信技术和JAVA网络编程的基础知识,利用Eclipse开发工具开发而成的一个小型的基于JAVAWeb通信系统。

1.2.2课题设计要求

  1. 深入了解计算机网络通信基础和网络编程技术。

查阅与网络通信设计相关的文献资料,尽可能地搜集与本课题相关、类似的软件系统。

  1. 结合已经有的相关资料,设计出缜密的网络拓扑结构图、总体设计和详细设计。
  2. 选择、运用适当的语言工具及其他工具实现设计方案。
  3. 根据要求撰写设计说明书(论文)。

1.3 课题的调研

在本系统开发之初,为了做好系统需求分析工作,本人做了充分的调研,从而认识到完成本系统需做到以下几点:

  1. 熟练掌握计算机网络通信的基本原理、网络体系结构、协议。
  2. 熟练掌握JAVA网络编程技术。
  3. 要有正确的设计思想、思维方式以及独立的工作能力,要提高分析问题、综合运用所学理论知识和基本技能解决实际问题的能力。
  4. 通过毕业设计,能够综合运用所学知识调查、分析、解决实际问题;形成能够独立开展研究、独立完成工程总体规划和设计的工作能力。在理论联系实际中,掌握和巩固所学专业知识,为步入社会打好基础。

1.4 可行性分析

1.4.1 可行性分析的目的

可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决,必须记住,可行性研究的目的不是解决问题,而是确定问题是否值得去解。如何达到这样的目的? 当然不能靠主观的猜想,应当进行客观分析。同时必须分析几种主要的可能解法的利弊,从而判断原定的系统目标和规模是否能实现,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度。因此,可行性研究的实质是要进行一次大大压缩简化了的系统分析和设计的过程。

首先需要进一步分析和澄清问题定义。在问题定义阶段初步确定设计的规模和目标,如果是正确的就进一步加以肯定,如果有错误就应该及时改正,如果对目标系统有任何约束和限制,也必须把他们清楚的一一列举出来。

在澄清了问题定义之后,分析员应该导出系统的逻辑模型。然后从系统逻辑模型出发,探索若干种可供选择的主要方法(即系统实现方案)。对每种解法都应该仔细研究它的可行性,一般说来,至少应该从下述四方面研究每种解法的可行性:

(1)   技术可行性

(2)   经济可行性

(3) 操作可行性

(4) 法律可行性

1.4.2 技术可行性分析

  1. 开发本系统软件环境配置:
  1. Windows 2000/XP 操作系统;
  2. SQL Server 2000数据库系统;
  3. Eclipse开发工具

2)开发本系统硬件环境配置:

  1. CPU速度在500MHz以上;
  2. 内存在128MB以上

 JAVA技术日趋成熟,JAVA的平台无关性使得用JAVA写的应用程序不用修改就可在不同的软硬件平台上运行,它支持数据分布和操作分布这两种分布性, 对于前者,Java提供了一个叫做URL的对象,利用这个对象,你可以打开并访问具有相同URL地址上的对象,访问方式与访问本地文件系统相同。对于后者,Java applet小程序可以从服务器下载到客户端,即部分计算在客户端进行,提高系统执行效率。

Java提供了一整套网络类库,开发人员可以利用类库进行网络程序设计,方便实现JAVA的分布式特性。

另外Java还支持多线程。一方面,Java环境本身就是多线程的。若干个系统线程运行负责必要的无用单元回收,系统维护等系统级操作;另一方面,Java语言内置多线程控制,可以大大简化多线程应用程序开发。Java提供了一个类Thread,由它负责启动运行,终止线程,并可检查线程状态。Java的线程还包括一组同步原语。这些原语负责对线程实行并发控制。利用Java的多线程编程接口,开发人员可以方便得写出支持多线程的应用程序,提高程序执行效率。

从以上技术要求来看,当今现有的技术绝对能够满足设计这个系统的要求。

1.4.3 经济可行性分析

开发此网络通信系统所需的硬件(计算机及相关硬件)和软件环境(Eclipse开发工具;数据库SQL Server),在市场上都很容易购买到或从相关网站免费下载,开发系统成本主要集中本系统的开发与维护上,对用户不造成过重的经济负担。而一旦此系统投入使用,可作为公司,企业内部交流工具使用,一方面既充分利用网络资源,又保证内部信息的安全 所节省的大量人力、财力产生的效益将远远大于本系统的开发成本,所以经济方面上讲开发此系统是可行的

1.4.4 操作可行性分析

此网络通信系统具备友好的用户界面,使用方便、快捷,操作简单且易于维护,易于被用户接受,用户只需熟练操作计算机,和对此系统使用做简单的了解即可方便使用,而且使用此系统可以大大促进人们之间的交流和沟通,从操作方面看,此系统的开发是可行的。

1.4.5 法律可行性分析

此网络通信系统是由本人开发研制而成,在法律上并未侵害他人权利,无须承担任何法律责任,所以在法律方面开发此系统是完全可行的。

通过可行性分析,此系统在无论从技术上还是经济上都是完全可以实现的。我计划用Eclipse开发工具利用TCP/IP协议,UDP协议,SocketJAVA多线程等主要技术,在两个月内完成系统的基本功能,并在此基础上不断的完善和补充。

1.5 论文各章简介 

第1章引言部分,引言主要叙述关于此课题的国内外的研究状况、问题的定义和内容简介、课题的调研和可行性分析。

第2章主要内容是系统需求分析,包括:业务流程分析;数据流分析;数据字典。

第3章主要内容是系统总体设计,包括: 系统开发的原则;系统开发设计要点系统总体功能结构设计系统数据库设计开发环境设计与运行环境设计。

第4章主要内容是服务器模块设计,包括:主服务器类设计;多线程Server Thread类的设计;登录验证模块设计;新建用户模块;好友管理模块(查找好友模块,读取好友信息模块,添加好友模块,添加好友应答模块,删除好友模块,退出下线模块)。

第5章主要内容是客户端模块设计,包括:新用户注册模块;用户登录模块;消息通信模块(发送消息,监听用户操作消息,接收消息,发送文件,接收文件);好友管理模块(查找好友,添加好友,查看资料,更新好友列表,删除好友)。

第6章主要内容是用户手册,包括:系统功能简介;系统运行环境和安装环境简介;系统的操作指南说明。

第7章主要内容是系统评价,包括:系统的特色和优点简介;系统存在的不足与改进方案说明;毕业设计的收获和心得。

最后还有结论、致谢、参考文献等等内容的介绍。

2 系统需求分析

2.1 业务流分析

在对系统的组织结构和功能进行分析时,需从一个实际业务流程的角度将系统调查中有关该业务流程的资料都串起来作进一步的分析。业务流程分析可以帮助我们了解该业务的具体处理过程,发现和处理系统的调查工作中的错误和疏漏,修改和删除原系统的不合理部分,在新系统基础上优化业务处理流程。

本课题设计的网络通信系统业务流程如下:

  1. 系统启动服务器。
  2. 客户端向服务器注册,告知服务器它在监听某主题。
  3. 客户注册之后,向服务器发送有关事件处理消息,如发送消息给好友,接收好友的消息,发送文件,接收文件,删除好友,查看好友资料,添加好友等等。
  4. 服务器再把相应的消息发送给所有监听此主题的客户。

2.2概念结构设计

概念模型(E-R图):

N

N

注册用户A

好友关系

注册用户B

用户的号码

用户的资料

用户的E-Mail

用户状态

用户的性别

用户的IP地址

用户的籍贯

注册用户A

用户的昵称

用户的密码

 2.3 数据流分析

数据流程分析主要包括对信息的流动、传递、处理、存储等的分析。数据流程分析的目的就是要发现和解决数据流通中的问题。现有的数据流程分析多是通过分层的数据流程图(data flow diagram,简称DFD)来实现的。其具体的做法是:按照业务流程顺序,将相应调查过程中所掌握的数据处理过程,绘制成一套完整的数据流程图。

做出初步的数据流图如下:

发送信息

D1

注册

读取好友信

息的请求

登录请求

用户B

 4

消息通信

 3

好友管理

用户           A

信息

用户基本信息表

2

登录

接收消息

D2

用户好友表

1

注册

2.4 数据字典

2.4.1数据字典

数据字典是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。数据流图和数据字典共同构成系统的逻辑模型。

数据流条目

  1. 用户基本信息表

  编号:D1

  来源:客户端写入

  去向:数据库

  数据流量:每位用户1份

  组成:{用户的号码+用户的昵称+用户的密码+用户的状态(在线否)+IP地址+用户的资料+用户的头像+用户性别+用户的E-Mail和用户的籍贯}

  1. 用户好友表

  编号:D2

  来源:客户端写入

  去向:数据库

  数据流量:每位客户1份

  组成:{用户的号码+好友的号码}

⒉数据元素条目

    以下以用户的号码,用户的昵称,用户的状态,用户的资料四个数据元素条目为例:

  1. 名称:用户号码

  编号:F1

  别名:用户名

  类型及长度:整型,4

相关联数据:用户好友表

  1. 名称:用户昵称

  编号:F2

  别名:无

  类型及长度:字符型,10

  1. 名称:用户状态(在线否)

  编号:F3

  别名:无

  类型及长度: 布尔型,1

  取值范围:“0”,“1”

  1. 名称:用户的资料

  编号:F4

  别名:无

  类型及长度:varchar,50 

2.4.2处理逻辑说明

  1. 处理逻辑名:  用户注册

  说      明:  新的用户首先要进行注册,生成用户的号码和登录密码之后才能进行服务器登录。

  处理逻辑编号:1

  输入的数据流:用户名、密码,昵称等信息

  处 理 过 程: 用户首先将自己的信息资料输入,包括用户的号码,昵称 ,用户的资料,用户的性别,E-Mail,用户的籍贯等。

  输出的数据流:用户信息表

  处 理 频 率: 对每个用户基本信息表处理一次

  1. 处理逻辑名:  用户登录

说      明:   客户登录,进行网络聊天通信

处理逻辑编号: 2

输入的数据流: 用户名、密码

处 理 过 程:  服务器连接数据库,查询用户信息表,判断登录信息是否正确

输出的数据流: 服务器返回的登录处理数据流

处 理 频 率:  对每个用户基本信息表处理一次

  1. 处理逻辑名:  好友管理

  说      明:   上线的用户根据自己需要进行查找好友,添加好友,删除好友,查看资料等操作

  处理逻辑编号:  3

  输入的数据流:  用户的相关操作信息

  处 理 过 程:   根据用户提出的操作要求,连接服务器,进行数据库查询,得到符合条件的相关信息,服务器将结果返回给用户。

  输 出 的数据流:服务器返回的相应处理结果

  处 理 频 率:   依用户要求进行处理

  1. 处理逻辑名:  消息通信

  说      明:   两个或多个用户通过连接服务器,进行网络通信

  处理逻辑编号: 4

  输入的数据流: 用户的发送消息或接收消息流。

  处 理 过 程:  用户通过在好友列表中好友的IP地址,利用UDP协议与其他用户进行信息交流。

  输出的数据流: 符合条件的发送(接收)消息流

  处 理  频 率: 依用户要求进行处理

3 系统总体设计

3.1 系统开发的原则

   3.1.1 面向用户的观点

网络即时通信系统是为用户开发研制的,用户是系统的最终使用者和评价者,所以在网络通信系统的开发设计的过程中,我们树立了从用户的寻求出发,面向用户,一切为了用户的观念,在分析与设计系统的前期,为了保证系统的功能的完善多次寻求周围同学和老师的意见,了解他们的要求,依照功能完善,界面美观,操作简单的原则进行设计 。

3.1.2 严格按阶段进行

系统的开发设计是一项较大的工程,所以应该将整个系统的开发设计过程划分为若干阶段,相应的阶段又要分为若干个不同的步骤,每个阶段和步骤都要有明确的工作任务和目标。这种有序的组织安排,条例清楚、层次分明,便于计划的制定和控制,且为后续工作的进行奠定了坚实的基础,提高了工作效率和质量。

   3.1.3 采用系统的观点处理

在系统分析阶段,在对原系统进行全面调查和分析的基础上,构造系统的最佳逻辑模型,使用户对将来完整系统的轮廓有个初步的了解和认识,以便及时和用户进行交流和探讨,不断提高系统的完善性。在此基础上进行系统的物理实现和设计,切实完成逻辑模型的具体功能。逻辑设计和物理实现二者是相辅相成、密不可分的,这样使系统的设计更加稳妥合理。

   3.1.4采用模块化设计方法

系统模块化设计方法是从计算机实现的角度出发对整个系统进行审核和校验,将整个系统划分为不同的功能模块,实现系统的一个特定功能。各个功能模块之间具有相对独立性,便于整个系统的设计、实施、维护和扩充。这种模块化结构设计方法,为整个系统顺利进行奠定了基础。

   3.1.5 整个系统的设计主要采用快速原形法

快速原形法是信息系统设计的一个重要方法。它是根据用户提出的需求,由用户和开发者共同确定系统的基本要求和主要功能,并在一个较短的时间内建立一个实验性的、简单的信息系统模型,通过用户不断提出的意见和建议,对模型进行不断的修改和完善,直到用户比较满意为止,以便形成一个相对稳定、较为理想的管理信息系统。该方法的主要优点:

  1. 脉络清楚,所有问题都围绕一个模型展开,使彼此之间联系紧密。
  2. 有助于发现用户需求,通过对原形和用户接触,能够启发开发人员去挖掘问题,从而不断的修正、完善,最终得到一个理想的系统。
  3. 系统开发效率高,此方法的开发周期短、使用灵活、容易修改,这对于管理体制不够稳定的系统更加适合。
  4. 系统的可扩展性好,由于此方法是在原型应用中不断发展完善和修改的,所以有较强的扩展性。

3.2系统总体功能结构设计

3.2.1 系统代码设计说明

在进行代码设计时,遵循了以下原则:

  1.   唯一性   在本系统中,每一个代码都和系统中的每一个对象唯一确定。
  1.  标准性   主要体现在对程序文件名命名和对数据文件命名的标准化上,遵循简单扼要,方便适用的原则。一目了然,无重复现象。为了系统维护人员便于进行系统维护,使用了统一的标准。
  2.  合理性   系统中代码设计与编码对象的分类相适应,以使代码对编码对象的分类据有标志作用。
  3. 简单性   在设计过程中采用Code-Behind代码分离,使数据库操作代码和前端调用代码分离,页面修改容易。
  4. 适应性   在代码设计过程中,代码反映了编码对象的特点,便于识别和记忆,使系统维护人员容易了解和掌握,便于进行维护工作。
  5. 规范性   代码的结构,类型,格式统一,便于记忆和计算机进行处理。
  6. 可扩充性 考虑到今后程序扩充需要,在编制代码时,留有足够的备用代码。

3.2.2 系统设计技术说明

  1. TCP/IP协议

TCP/IP协议是聊天工具在建立连接时使用的协议,该协议是网络中使用的通信协议,包括传输控制协议和网际协议,TCP/IP协议是网络互连的标准协议,可使不同环境下不同节点之间进行彼此通信,是连入互联网的所有计算机在网络上进行各种信息交换和传输所必须采用的协议。TCP/IP协议实际上是一种层次型协议,是一组协议的总称,它的内部包括很多协议,它们组成了TCP/IP协议组。

  1. UDP协议

两个用户之间聊天期间使用的是UDP协议,UDP协议是用来在互联网络环境中提供包交换的计算机通信的协议,此协议默认为网络协议是其下层协议。此协议提供了向另一用户程序发送消息的最简便的协议机制。此协议是面向操作的,未提供提交和复制保护。因为聊天系统对于聊天期间的数据可靠性要求不高,所以使用UDP协议。

  1. 基于套接字(Socket)的编程
  1. Socket用两种类型:在聊天工具程序中均有用处

TCP Socket:由Socket类实现

UDP Socket:由Datagram Socket类实现

  1. 基于连接的流式Socket编程

 Socket(套接字)是TCP/IP协议的编程接口,即利用Socket提供的一组API就可以编程实现TCP/IP协议,在Java语言里,这个编程接口就是若干系统预先定义好的类。

    1. InetAddress类

InetAddress类主要用来区分计算机网络中的不同节点,即不同的计算机并对其寻址。每个InetAddress对象包含了IP地址,主机名信息。

    1. 流式Socket通信机制

流式Socket所完成的通信是一种基于连接的通信,即在通信开始之前先由通信双方确认身份并建立一条专用的虚拟连接通道,然后它们通过这条通道传送数据信息进行通信,当通信结束时再将原先所建立的连接拆除。这个通信过程如图所示:

Server 端

Client 端

关闭Server Socket对象结束监听服务

创建Server Socket对象在某端口提供监听服务

等待来自Client端的服务请求

接收Client端的请求用返回的Socket建立连接

通过向Socket中读写数据来与Client端通信

关闭Socket,结束与当前Client的通信等待其他请求

创建Socket对象向Server的监听端口请求

通过向新的Socket中读写数据来与Server通信

关闭Socket,结束与Server端的通信

建立连接

数据通信

数据通信

    图中Server端首先在某个端口提供一个监听Client请求的监听服务并处于监听状态,当Client端向该Server的这个端口提出服务请求时,Server端和Client端 就建立了一个连接和一条传输数据的通道。当通信结束时,这个连接通道被同时拆除。

    基于连接的通信可以保证整个通信过程准确无误,但是连接的建立和拆除增加了程序复杂性,同时在通信过程中始终保持连接也会占用系统的内存等资源,所以只适合于集中的安全性要求高的通信。

  1. 无连接的数据报UDP

数据报是无连接的通信服务,数据以独立的包为单位发送,不保证传送顺序和内容的准确性。数据报Socket又称为UDP套接字,它无须建立,拆除连接,直接将消息打包传给指定的目的地,使用起来比流式数据报要简单一些。

Java中用于无连接的数据包通信的类有两个:DatagramPacket类和DatagramSocket类。其中DatagramPacket类 用于读取数据等信息,DatagramSocket类用于实现数据报的发送和接收过程。

  • 数据报的发送过程可简单表述如下:
  1.  创建DatagramPacket对象,使其中包含以下信息:
  1. 要发送的数据
  2. 数据报分组长度
  3. 发送目的地的主机IP地址和目的端口号
  1.  在指定的或可用的本级端口创建DatagramSocket对象
  2.  调用该DatagramSocket的send()方法,以DatagramPacket对象为参数发送数据报。
  • 数据报的接收过程描述如下:
  1.  创建一个用于接收数据报的DatagramPacket对象,其中包含空白数据缓冲区和指定数   据报分组长度。
  2.  在指定的或可用的本机端口创建DatagramSocket对象
  3.  调用DatagramSocket对象的receive()方法,以DatagramPacket 对象为参数接收数据报,接收到的信息有:
  1. 收到的数据报文内容
  2. 发送端的主机IP地址
  3. 发送端主机发送端口号

3.2.3 系统总体功能结构

由客户端程序界面可知,本网络通信系统包含以下主要功能:

  1. 用户注册;用户登录;
  2. 上线通知;退出下线通知;
  3. 查找好友;查看好友资料;
  4. 直接添加好友;添加好友;添加好友应答;
  5. 删除好友;更新好友列表;
  6. 发送消息;接收好友消息;发送文件,接收文件,接收陌生人信息;

根据系统的要求,出功能模块图如下

        网络通信系统

  服务器端模块

   客户端模块

  操作数据库

  监听客户

   发送文件

  用户注册

  消息通信

  用户登录

  好友管理

接收文件

   接收消息

   查找好友

   添加好友

   查看资料

  更新好友列表

   删除好友

   发送消息

  建立连接

3.3 系统数据库设计

数据库表主要用来存放用户的注册信息和用户的好友资料,可利用两张数据库表来  存放用户信息和用户好友的资料。表1 icq表存放用户信息,包括用户的号码,昵称,密码,在线与否,ip地址,资料,头像号,性别,E-mail和籍贯等信息。其中,用户昵称和密码是必需的字段;在线与否是由系统自动设置的;其余的信息是可选的字段。

表1:用户的基本信息表(icq)

序号

字段名

含义

数据类型

NULL

1

icqno

用户的号码

int

NO

2

nickname

用户的昵称

char

NO

3

password

用户的密码

char

NO

4

status

用户的状态

bit

NO

5

ip

用户的ip地址

char

YES

6

info

用户的资料

varchar

YES

7

pic

用户的头像号

int

YES

8

sex

用户的性别

char

YES

9

email

用户的E-mail

char

YES

10

place

用户的籍贯

char

YES

注: icqno为自动增加的字段。

表2:用户的好友表(表名 friend)

序号

字段名

含义

数据类型

NULL

1

icqno

用户的号码

int

NO

2

friend

好友的号码

int

NO

3.4开发环境设计与运行环境设计

3.4.1 开发环境设计

本课题整体以JAVA为平台,采用Eclipse开发工具,并使用SQL Server 2000管理数据库数据开发而成的基于Socket的集中式网络通信系统,系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器应用程序服务器端 应用程序客户端。系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的通信开销。

  1. . 客户层 (应用表示层)

     客户层是应用程序的用户接口部分,它担负着用户与应用间的对话功能,用于检查用户的输入数据,显示应用的输出数据,为了直观的进行操作,客户层需要使用图形用户接口,若聊天用户变更,系统只需改写显示控制和数据检查程序即可,而不会影响其他两层。

  1. .服务层(功能层)

服务层相当于应用的本体,它是将具体的业务处理逻辑编入程序中。在应用设计中,必须避免在表示层和功能层之间进行多次的数据交换,这就需要尽可能进行一次性的业务处理达到优化整体设计的目的。

  1. .数据层

数据层是DBMS,本系统使用了Microsoft 公司的SQL Ssever2000数据库服务器来管理数据。SQL Ssever2000能迅速的执行大量数据的更新和检索,因此,从功能层传送到数据层的要求一般都使用SQL语言。其分层结构如图所示:

Socket (TCP)

Socket (TCP)

服务器

数据库SQLServer2000

JDBC-ODBC

3.4.2 运行环境设计

  1. 因为本系统是用Eclipse工具来开发的,所以首先要安装Eclipse开发工具。Eclipse开发工具可以安装在任何操作系统上,本课题是在Windows 系统下安装的Eclipse,在安装之前,要先安装Java的JDK(或运行环境JRE)来支持Eclipse的运行。本系统的安装环境为:Windows XP中文版+JDK1.4.2_06+Eclipse3.1.1。
  2. 说明:在Windows系统下安装Eclipse不需要设置JDK环境变量。为了使用方便 ,把JDK和Eclipse都安装在C盘目录下。

4 服务器模块设计

4.1 主服务器类设计

  1. 在设计服务器时需要考虑如下因素:
  1. 服务器的运行速度
  2. 服务器的响应速度,包括新建连接和发送数据的响应速度
  3. I/O吞吐量
  4. 其他:流量控制,安全性
  1. 针对TCP/IP协议的数据结构,设计服务器的程序结构需要考虑如下因素:
  1.  多线程
  2. 单线程

主服务器类实现了服务器端的多线程,即使用ServerSocket=new ServerSocket(8080)语句在8080端口创建套接口;使用new ServerThreadsocket)语句创建新的线程。主服务器类调用ServerThread类,而每个ServerThread实体就是一个单独的线程,即对应于客户端连接请求响应的线程。服务器端有一个进程在指定的端口等待客户的连接信息,一旦连接成功,就可以按设计的数据交换方法和格式进行数据传输。客户端只在需要的时候向服务器发出连接请求。

(2)实现代码如下:

public class Server{                                 //主服务器类

Public static void main (String args []) throws IOException {

ServerSocket s=new ServerSocket(8080);                //8080端口创建套接口

System.out.println ("Server start...”+s);

try {

     while(true){Socket socket=s.accept();              //无限监听客户的请求

      System.out.println ("Connection accepts: “socket);

       try{new ServerThread(socket);                  //创建新线程

         }

catch (IOException e) {socket. close () ;}

   }finally{s.close();}                                 //捕或异常

 }

  1. 注明:只使用try catch关键字会带来一些隐患 ,最可怕的问题是程序的清除,当异常发生时,程序被中断,异常处理程序开始处理响应的情况,我们虽然可以将清除工作放在异常处理模块中,但这绝对不是万无一失的解决方案。像针对连接的操作,一般都要求关闭连接,无论try发生怎样的错误,甚至都没有发生任何错误,都必须清除连接,这种情况下在catch块中清除连接是不合理的,因为程序可能不执行catch块中的代码;在try块中执行清除是不合理的,因为程序可能被提前中断,所以在关闭连接的时候一定要使用finally关键字。Finally关键字所包含的程序段,必须被执行,无论try块中是否有异常发生。

4.2 多线程ServerThread类的设计

  1. ServerThread函数执行过程可描述如下:
  1. 执行ServerThreadSocket s)线程构造函数
  2. 执行socket=s 取得传递函数
  3. 使用BufferedReadernew InputStreamReadersocket.getInputStream()))创建数据流
  4. 使用PrintWriternew BufferedWriternew OutputStreamWritesocket.getOutputStream())))创建输出流
  5. 使用start()函数启动线程
  6. 最后使用run()线程监听函数。
  1. 设计说明: run()函数用于监听已经建立连接的线程。

具体实现代码如下:

class ServerThread extends Thread{                //继承线程

private Socket socket;                       //定义套接口

private BufferedReader in;                   //定义输入流

private PrintWriter out;                      //定义输出流

int no;//定义申请的jicq号码

public ServerThread(Socket s) throws IOException { //线程构造函数

socket=s;//取得传递参数

in=new BufferedReader(new InputStreamReader(socket.getInputStream())); //创建输入流

out=new PrintWriter (new BufferedWriter (new OutputStreamWriter

(socket.getOutputStream ())), true);

start();}//启动线程

4.3 用户注册模块

  1. 新建用户是网络聊天工具的一个基本功能,用户新建过程如下:
  1. 首先在客户端填写用户相关注册信息,点击“注册”按钮
  2. 然后发送“new”新建请求,连接服务器。
  3. 服务器利用run()函数监听到来自客户端的请求,使用Class.forname方法加载数据库驱动类。
  4. 然后使用DriverManager.getConnection  方法连接数据库
  5. 最后服务器接收客户端用户发送的号码,昵称,密码,用户E-Mail。个人资料,籍贯   和性别,头像等信息,执行数据库添加操作完成用户的创建。
  1. 用户注册流程如下:

并返回用户号码,在数据库中注册用户的IP地址等信息

客户端

服务器

结束

执行数据库添加

得到jicq号码

建立连接

发送连接请求

发送昵称,性别,个人资料等信息

Socket

ServerSocket

Accept

in new

in information

停止接收

out jicqno

out new

out information

发送完毕

in jicqno

打开主程序窗口创建UDP

数据库

结束

4.4 登录验证模块设计

4.4.1登录线程设计

  1. 用户登录流程表述如下:
    1. 客户端在登录窗口输入登录号码和登录密码,点击“登录”按钮。
    2. 客户端发送“login”请求,表示需要登录,连接服务器。
    3. 服务器run()函数监听到该信息后,连接数据库,准备从数据库中选择昵称和密码。
    4. 服务器接收到客户端发送过来的号码和密码信息后,设定数据库查寻条件,并执行数据库查寻,比较输入的用户名和密码和数据库中信息是否相符,如果相符则表示登录成功,并弹出登录后的主窗口。否则,则出现信息出错提示框。提示框如图所示:

  1. 用户登录流程如图所示:

服务器

客户端

信息匹配

查询数据库

比较数据库表数据与用户输入信息是否相符

建立连接

发送登录请求

发送icqno和密码信息

Socket

ServerSocket

Accept

in login并连接数据库

in information

out false

或者登录成功信息

结束

out login

out information

读取服务器信息

打开主程序窗口创建UDP

数据库

4.4.2 通知好友上线模块

    1. 服务器首先连接数据库,再根据“我的号码”从好友列表中得到我的好友列表,然后利用广播通知他们我已经上线了。
    2. 通知好友上线模块流程如图所示:

上线的用户

run( )函数线程监听

判断输入流是否等于getwhoaddme

连接数据库,读入 myicqno,查询好友表

利用循环语句得到每一个好友的ip地址,并返回众好友的ip地址

利用循环语句判断是哪一个好友上线,更新好友列表头像

判断输入流等于监听函数的哪一个字符串,并执行响应的操作

连接服务器

out getwhoaddme,myicqno

客户端接收众好友ip,根据好友ip发送online数据报

结束

要通知的好友

Online按钮事件响应

4.5 好友管理模块

4.5.1 查找好友模块

当客户端向服务器发送查找好友的请求后,服务器立即响应并调用Class.forname 方法加载数据库驱动类sun.jdbc.odbc.JdbcOdbcDriver , 然后调DriverManager.getConnection完成数据库的连接,得到好友查询的结果。查询结果包括:好友的昵称,头像信息,性别,籍贯,E-Mail,个人资料等。客户端接收到查询结果后,利用响应的函数将其显示出来。

4.5.2 查看好友资料模块

用户在得到好友列表后,可根据需要读取好友的详细资料。查看好友资料功能是在查找好友功能的基础是建立的。当客户点击“查看资料”菜单子项时,客户主程序监听到用户的操作要求,同时调用void lookinfo_mousePressed(MouseEvent e)事件处理程序,把已经用Vector矢量保存好的好友号码,昵称,性别, IP地址,状态,头像和个人资料信息返回给客户。

4.5.3 直接添加好友模块

客户端发送“addnewfriend”请求,连接服务器,服务器根据客户端发来的用户号码和用户想要添加的好友的号码进行数据库操作,直接将该号码添加到用户的好友表中,而不需要经过被添加的用户的同意。

4.5.4 添加好友模块

  1. 添加好友的步骤如下:
  1. 客户端用户点击“加为好友”按钮,向服务器端发送“addfriend”请求。
  2. 服务器响应客户端用户的请求后,首先连接数据库,并根据接收的用户号码在fiend表中查询用户所有的好友号码,如果接收的用户想要添加的好友号码已经是好友的列表,则向客户端发送“same”应答,在客户端将弹出“该用户已经是你的好友的提示框 ”
  3. 如果该用户想要添加的好友未在用户好友表中,则根据接收的用户号码和好友号码向好友表添加记录,服务器使用r6保存查询结果,若r6为1,则表明添加成功,服务器将向客户端发出“ok addfriend”消息,否则,添加好友失败,服务器将给客户端发出“false addfriend”的消息。
  1. 添加好友流程如下:

添加好友的用户

run( )函数线程监听

连接数据库,读入 myicqno,查询好友表

判断输入流等于监听函数的哪一个字符串,并执行响应的操作

连接服务器Out addfriend,myicqno, jicq.get(dd)

被添加的好友

“加为好友”按钮事件响应

 判断好友是否在好友列表中?

向客户端发送“add”输出流

向客户端发送“same”输出流

客户端接收服务器端信息

判断接受到的信息

是否是“same”?

发送数据报给对方,内容为“oneaddyou”

弹出“该用户已经是你的好友”的对话框”

判断输入流是否等于oneaddyou

弹出Oneaddyou 对话框

 连接服务器添加好友

关闭对话框

判断是否

  同意加他?

结束

 4.5.5 添加好友应答模块

  1. 如果用户A将用户B加为好友,则弹出提示框“用户A已经把你加为好友”。用户B可以选择添加A为好友,也可以选择不加。
  2. 如果用户B选择添加A为自己的好友,则向服务器发送“addnewfriend”请求
  3. 服务器收到请求后,连接数据库,根据接收的用户号码以及好友号码向好友表添加记录。若添加成功,则服务器利用r5保存处理结果,比如昵称,号码,性别等信息,并向客户端输出结果。

4.5.6 删除好友模块

  1. 首先,点击“删除好友”按钮,响应函数将首先向数据库发送“delfriend”请求,同时发送用户的号码(myjicq)和想要删除的好友号码(friendjicq),其中用户的号码是在登录时创建主窗口时获得的,要删除的好友号码利用list.getSelectedIndex()这个索引获得。
  2. 当服务器接收到客户端的删除好友请求后了,它连接数据库,并根据接收的用户号码以及好友号码将好友表中记录删除。服务器利用r7保存删除结果。若r7为1,则删除成功,服务器给客户端发出“ok delfriend”的消息;否则删除好友失败,服务器给客户端发出“false delfriend”的消息。
  3. 在发送请求给数据库的同时,客户端需要在好友列表中利用list.removeElementAt(index)方法把好友的头像以及昵称信息也删除掉。

4.6 退出下线模块

用户在线时,数据库表的IP地址字段为此时用户计算机的IP地址;状态字段status

为1,若用户退出下线,服务器完成修改IP字段和状态字段。服务器首先利用Class.forName方法加载数据库驱动类sun.jdbd.odbc.JdbcOdbcDriver; 然后用DriverManager.getConnection连接数据库。最后根据用户号码,将其状态字段设为0,IP地址字段设为空。

客户端模块设计

客户通过Socket与服务器建立连接。服务器与客户都通过构造BufferedReaderPrintWriter来建立输入/输出流。双方通过该输入/输出流来互相传递消息。一旦收到客户端的连接请求,服务器利用accept()函数返回一个新建的Socket对象,随后客户端向服务器发送消息,诸如用户注册,登录请求、查找好友请求等。服务器收到请求后,针对不同的消息处理请求。

 5.1新用户注册模块

 5.1.1 注册流程

  1. 当服务器收到用户注册请求后,开始接收客户传递的消息,诸如客户的号码,昵称,密码,性别,头像,个人资料等等信息。接收完毕后,服务器通过JdbcOdbc与后台数据库连接,向数据库添加记录。
  2. 若新用户注册成功,则向客户返回号码,并在数据库中注册用户的IP地址,设定status值告知用户在线(Status为1)。客户收到服务器返回的信息后,打开主窗口,同时创建UDP以便在用户之间建立联系。

   5.1.2 注册事件监听流程

  1. 注册事件处理是客户端注册的主要部分。Java事件包括键盘事件,鼠标事件和按钮等事件。而所用到的是鼠标事件实际就是点鼠标按钮时,系统会调用监听器,包括mousePressedmouseReleasedmouseClicked监听流程如图所示:

从服务器返回号码

事件监听

连接服务器

发送请求通知

发送注册信息

读取服务器信息

成功?

报错

结束

  1. 注册按钮实现代码:

void jButton1_mouseClicked(MouseEvent e) {

 try { System.out.println(sername);

      System.out.println (serverport);

      Socket socket=new Socket (InetAddress.getByName (sername), serverport);

//连接服务器

      BufferedReader in=new BufferedReader (new InputStreamReader (socket.getInputStream ()));

      PrintWriter out=new PrintWriter (new BufferedWriter (

                              new OutputStreamWriter (socket.getOutputStream ())), true);

out.println("new");//发送新建用户请求

out.println (icqno.getText ().trim ());

out.println(nickname.getText().trim());      //发送昵称等信息

out.println (password.getPassword ());

out.println (email.getText ().trim ());

out.println (info.getText ().trim ());

out.println (place.getSelectedItem ());

out.println (headpic.getSelectedIndex ());

int no;

no=Integer.parseInt(in.readLine());

System.out.print (no);

     String str=" ";

      //do{

        str=in.readLine().trim();//从服务器读取信息

        //如果出错

  if(str.equals("false")) JOptionPane.showMessageDialog(this,"对不起,出错了:-(","ok",JOptionPane.INFORMATION_MESSAGE);

   else{//如果成功就告诉用户其号码

       JOptionPane.showMessageDialog(this,"恭喜您,您已经成功注册!您的注册号码是:"+no,"ok",JOptionPane.INFORMATION_MESSAGE);

this.dispose();//并打开主窗口

        MainWin f2=new MainWin (no, sername, serverport);

        f2.setVisible (true) ;}

    } catch (IOException e1) {}    //捕获IO异常

}

5.2 用户登录模块

  1. 用户登录首先要与服务器连接,服务器的连接是在ConnectServerint myid)函数中实现。本函数用到了具有连续性,有序性特点的流(Stream),根据服务器的ip地址和端口来完成客户端和服务器端的连接。ip地址是网络唯一的地址标识。

客户端连接流程:

      • 程序初始化
      • 填写服务器地址信息和端口信息,建立客户端socket,并定义输入流和输出流
      • 连接服务器,向服务器发出输出流out.println("friend")out.println(myid)即发出查询好友信息的请求,用户在登录窗口的好友列表中显示好友的头像和昵称。
      • 读取服务器端信息,将这些信息用变量数组保存,直到接收到从服务器返回的信息(over)才停止读取,利用循环语句根据接收到好友的状态信息判断好友在线与否,更新好友的列表,在列表中显示众好友的头像和昵称,同时在这个通信过程中,catch函数捕获异常
      • 通信结束后断开连接
  1. 创建用户客户端之间消息通信的CreatUDP( )函数,函数体中包括发送数据报和接收数据报sendSocket=new DatagramSocket();receive Socket=new DatagramSocket(udpPORT)其中发送数据报是利用public DatagramSocket( )构造函数创建,并将它连接到本地主机的任何一个可用的端口上,而接收数据报是利用new DatagramSocket(int  port)在指定端口创建。
  2. 调用FindFriend2类,并创建该类的实例
  3. 创建并启动线程Thread,监听服务器端与客户端消息以及客户端与客户端之间的通信消息,
  4. 捕获通信过程中的异常

客户端登录流程如下:

利用ConnectServerint myid)函数连接数据库,读取众好友的信息,分别用变量数组保存

构造CreatUDP( )函数,创建发送数据报和接收数据报sendSocket

receive Socket

调用FindFriend2类,并创建实例

创建并启动线程Thread,利用线程的run()函数监听服务器与客户间信息和客户端之间的信息

在登录过程中是否有异常?

点击“登录”按钮

中断程序,转去执行异常程序模块

登录成功,弹出主窗口,在主窗口好友列表中显示好友的头像和昵称

结束

5.2.1 监听登录事件

  1. 用户在客户端程序中输入用户号码和密码,与服务器连接,向服务器发送登录请求。
  2. 服务器收到该请求后,通过JdbcOdbc读取数据库,与用户输入的信息作比较,若用户输入的信息与数据库相同,则服务器向用户返回成功信息,将其status字段设为1,并注册用户当前使用的ip地址,否则服务器向客户返回登录失败的消息。客户端收到服务器的成功确认后,打开聊天主窗口,否则弹出失败信息。
  3. 若登录成功,系统弹出聊天主窗口,在主窗口中需要显示用户的好友列表(包含好友的昵称,头像和在线与否的状态信息),此时,客户端需连接服务器,并向服务器发送“friend”请求,要求读取好友信息。服务器经过相关操作后将返回用户的所有好友的信息,客户端通过相关相应函数,将在窗口中显示用户的好友。若显示的好友列表中好友的头像是灰色的,则代表该好友目前没有在线,若是彩色,则代表他(她)在线。
  4. 登录事件监听流程如图所示:

结束

事件监听

连接服务器

发送登录请求

发送用户登录信息

读取服务器信息

成功?

打开主窗口,在窗口中显示好友昵称及头像

弹出出错提示信息

5.2.2 界面设计

  1. 用户向登录界面输入自己的号码和密码,服务器地址和端口。服务器地址和端口是默认的,端口默认为8080,填写登录信息后,单击[登录]按钮,密码验证后完成登录过程。
  2. 登录界面如图所示:

  1. 用户完成登录后,客户端与服务器端建立连接,连接建立成功后,客户向服务器请求读取好友名单,服务器收到该请求,开始读取数据库中的friend表并得到好友的号码,再通过icq表读取好友的资料,向客户端发送这些信息,客户收到服务器信息后,在主窗口显示好友(即好友的头像和昵称)。客户端还建立矢量(Vector)来储存好友昵称,jicq号码,头像编号,以及ip地址等消息。

5.2.3 设计过程中遇到的问题

   在设计登录界面时,由于界面继承了JPanel类,而JPanel类又默认为不透明的面板,所以在加背景图的时候,总是显示一个灰色的面板,面板上的组件都显示不出来,后经过不断的调试,不断的查找问题,才终于弄明白,要在JPanel面板上加背景图片,首先要将组件的放在一个面板上,并且此面板要设置Opaque属性为false,再重新构造一个继承了JPanel类的面板类,并在重载paintComponent方法时调用超类super.paintComponent()方法将不透明面板的背景擦除,再将背景图片绘制在这个面板上,之后再将放置组件的面板添加到此面板上,这样才能实现系统设计的登录界面。

  1. 登录后界面:

   

5.3 消息通信模块

  1. 设计说明:

消息的收发主要是通过数据报服务实现的。Java实现数据报通信的过程除了面向连接的Socket外,还有无连接的数据报Socket数据报是网络层数据单元在介质上传输信息的一种逻辑分组格式,它是一种在网络中传播的,独立的,自身包含地址信息的消息。它能否到达目的地,到达的事件,到达时内容是否会变化是不是准确知道的。数据报的通信双方不需要建立连接,所以对于像聊天通信这些不需要很高质量的应用程序来说,我选择数据报通信。

  1. 如何使用数据报?

在Java的java.net包中有两个类DatagramSocket和DatagramPacket,它们为应用程序采用数据报通信方式进行网络通信提供了支持。

以客户端应用程序的工作流程为例:

  1. 首先,通信双方要建立数据报通信的Socket。它们可以通过创建一个DatagramSocket对象来实现它,其构造函数有两种:
    1. public DatagramSocket()构造一个数据报Socket,并使其与本地主机任一可用的端口连接。若打不开Socket则抛出SocketException异常。
    2. public DatagramSocket(int port)构造一个数据报Socket,并使其与本地主机指定的端口连接。若打不开Socket或Socket无法与指定的端口连接,则抛出SocketException异常。
  2. 然后,处理接收缓冲区内的数据,获得服务结果。
  3. 最后,当通信完成后,可以使用DatagramSocket 对象的close()方法来关闭数据报通信Socket。当然,Java自己会自动关闭Socket,释放DatagramSocket和DatagramPacket所占用的空间。
  1. UDP的工作流程

客户端与服务器之间的数据报通信工作流程与UDP方式下通信流程差别不大,具体分服务器流程和客户端流程两部分。

      1. 服务器程序流程:
  1. 程序初始化
  2. 填写本机地址信息
  3. 绑定一个固定的端口
  4. 收到client数据报后进行处理和通信
  5. 通信结束后断开连接
      1. 客户端程序流程:
  1. 程序初始化
  2.  填写服务器地址信息
  3. 连接服务器
  4. 与服务器通信和信息处理
  5. 通信结束后断开连接
  1. 创建数据报连接的步骤
  1. 首先创建一个发送连接,这是一个数据报式的连接
  2. 创建一个接收连接,也是一个数据报式的连接
  3. 最后输入连接的端口信息。

5.3.1 发送消息

  1. 用户通过好友列表中好友的ip地址,利用UDP协议与其他用户进行信息交流。
  1. 消息发送之前首先创建一个数据报文包,用来实现无连接的包传送服务。        
  2. 每个数据报文包是利用构造函数DatagramPacketbyte bufferedarray[],int length,     InetAddress address,int port)创建的。该DatagramPacket对象封装了数据报文包数据,包长度,目标地址和目标端口,参数length必须小于等于bufferedarray.length
  3. 消息发送是通过调用DatagramSocket对象的send方法实现的,它需要以DatagramPacket对象为参数,将刚才封装进DatagramPacket对象中的数据组成数据报发出。
  1. 发送消息的流程如图:

从输入框中获取要发送的信息

获得好友ip地址

新建并发送数据报

结束

IP存在吗?

  1. 具体实现代码为:

void send_mouseClicked(MouseEvent e) {//发送消息

try {

       String s=sendtext.getText (). Trim ();

       System.out.println("您发送的消息:"+s);

       byte [] data=s.getBytes ();

       System.out.println("发送目的地ip"+theip);

       theip.trim ();

       sendPacket=new

       DatagramPacket (data, s.length (), InetAddress.getByName (theip), sendPort);

       sendSocket.send (sendPacket) ;}

 } catch (IOException e2) {sendtext.append (sendtext.getText ());

      e2.printStackTrace ();}

           getinfo.append (" ");

           senddata.dispose ();

  }

  1. 界面运行如下:

 5.3.2 监听用户操作消息

  1. 监听好友的信息与监听好友上线功能是类似的。系统首先定义一个空数组,该数组用于接收消息中的数据,然后创建数据报,使用receiveSocket.receive(receivePacket)函数等待并接收数据报,取得数据报中的数据,根据取得数据的类型,监听器将判定是否有好友信息到来,是否有用户要添加我为好友,用户的好友是否上线或下线等等。若有好友上线,则好友的头像变成彩色,若有好友下线,则好友头像变为灰色。
  2. 监听函数部分代码如下:

public void run () {

while (true)

{

try {for (int x=0; x<512; x++) array[x] =' ';

//创建数据报

       receivePacket=new DatagramPacket (array, array.length);

    receiveSocket.receive (receivePacket);

    byte [] data=receivePacket.getData ();

           String infofromip=receivePacket.getAddress ().getHostAddress ().toString ().trim ();

           Received=new String (data, 0, data.length);

           Received. Trim ();

           index4=0;

   do{

    String friendip=friendips.get(index4).toString().trim();

    if (infofromip.equals(friendip)){

 String nameinfo=friendnames.get(index4).toString().trim();

 JOptionPane.showMessageDialog(this,"收到"+nameinfo+"的消息","ok",JOptionPane.INFORMATION_MESSAGE);

fromunknow=false;   break;   }//if

 Index4++;

 if(index4>=friendnames.size())

{

  fromunknow=true;//收到陌生人的消息

   JOptionPane.showMessageDialog(this,"收到陌生人"+infofromip+"的消息","ok",JOptionPane.INFORMATION_MESSAGE);

 }while(index4<friendnames.size());

};

catch (IOException  ex){ex.printStackTrace();}}

  1. 系统整个监听流程过程如图所示:

是否收到陌生人消息?

是否收到发送文件数据报 ?

是否收到准备准备接收文件的数据报?

弹出添加好友应答提示框

弹出收到好友消息提示框

上下线通知好友

发送数据报给另一个用户,发送 数据报 给 另外 一个 用户 ,通知他已经 准备好接受文件了 

结束

弹出收到陌生人消息提示框

是否添加好友?

是否好友上下线?

利用receiveSocket.receive() 函数等待并接收数据报

创建接收数据报receivePacket

发送文件

5.3.3 接收消息

  1. DatagramPacket类提供了4个函数来获取消息:
  1. Public byte[]getData():返回一个字节数组,包含收到或要发送的数据报中的数据
  2. Public int getLength():返回发送或接收到的数据的长度
  3. Public InetAddress getAddress():返回一个发送或接收数据报文的机器的ip地址。
  4. Public int getPort():返回发送或接收数据报的远程主机的端口号。

监听到消息到达事件

接收到变量getinfo

接收消息并显示

结束

确定接收并显示吗?

接收消息的流程如图所示:

  1. 为了接收从服务器返回的结果数据报文包,需要创建一个新的DatagramPacket对象,该对象利用了DatagramPacket类的另一种构造方式DatagramPacketbyte bufferedarray[]int length)即只需指明存放接收数据报的缓冲区和长度,系统调用DatagramSocket对象的receive()函数来接收数据报,并将DatagramPacket对象作为该函数的参数。receive()方法会一直阻塞直到收到一个数据报文包。而该数据存放在DatagramPacket对象的缓冲区中。数据报文还包含了发送者的ip地址和端口号等信息。
  2. 接收消息实现代码如下:

  void getmessage_mousePressed(MouseEvent e) {//接收消息

   String message=received.toString ().trim ();

  index=list.getSelectedIndex ();      //索引好友列表中的好友

if(index==index4)getinfo.append(message);  //接收到来自朋友的信息

else getinfo.append(" ");  //如果没人来信息,点击它则显示空的信息

getdata.show ();    //打开接收消息的窗口

}

  1. 运行界面如下:

5.3.4 发送文件和接收文件模块

  1. 为了保证发送文件和接收文件的安全性,需要利用TCP协议来完成。

下面以用户A要传文件给用户B为例,简要介绍一下发送文件和接收文件的过程:

  1. 首先,用户A发送数据报给用户B,数据包的内容是“readyreceive”,询问对方是否准备好接收文件
  2. 用户B的run()函数监听用户A的信息,当监听到消息时,判断监听到的数据报内容是不是“readyreceive”,如果是,则用户B做出响应,并发送数据报给用户A,数据报的内容是“readysend”,即通知用户A,他已经准备好接收文件了,同时建立接收文件类GetFile的对象gf,同时调用gf.fileServer()方法打开接收文件的服务端,等待接收文件
  3. 用户A的监听函数监听用户B的信息,在接收到数据报后,判断数据报内容是不是“readysend”,如果是,则用户A建立SendFile类的对象sf,利用sf.fileClient()方法建立客户端socket开始发送文件
  1. 发送文件和接收文件的过程如图所示:

文件传送

用户A

用户B

发送数据报“readyreceive”询问对方是否准备好接收文件

run()函数监听其他用户的信息

监听到数据报

建立接收文件服务器端在8888端口建立套接字ServerSocket

监听到数据报“readysend”

建立发送文件客户端socket,开始发送文件

接收文件结束,关闭ServerSocket

等待用户B接收文件,接收完后,关闭客户端socket

发送“readysend”数据报,通知用户B他已经准备好接收文件

5.4 好友管理模块

  5.4.1 查找好友

  1. 好友查找利用FindFriend2类来实现的。FindFriend2类继承了JFrame类。FindFriend2

中定义的界面控件包括:好友的昵称,性别,Jicq号码,IP地址,在线状态,头像,电子邮件,个人留言等信息。

查找好友所需的网络变量定义如下:

  1. Socket  socket: 连接Socket
  2. BufferedReader in :读取缓冲区
  3. PrintWriter out:输入缓冲区
  4. Int myid:用户的号码
  5. String serverhost: 发送端的主机地址
  6. Int setvport:服务器端的主机地址
  7. DatagramPacket sendPacket:存储发送信息的发送数据报
  8. DatagramSocket sendSocket:存储接收信息的接收数据报
  9. Int sendPort:发送的端口号

  5.4.2 添加好友

    1. 添加好友的基本步骤如下:
      1. 用户A登录后,向服务器发送查找请求,服务器响应并读取数据库表icq,将结果返回给用户。
      2. 用户在接收查询结果后选择用户B,向服务器发送添加好友请求,服务器收到请求后响应,更新数据库表friend,并从icq表中读取好友基本信息,将信息返回给用户A
      3. 用户A的客户端的主窗口显示B,并通过UDP通知用户B
      4. 用户B收到服务器的确认信息,可决定是否添加A为好友
      5. 如果要添加的用户已经在你的好友列表中,则出现提示“对方已经是你的好友的”提示框
    2. 界面运行如下:

   

5.4.3 查看资料

  1. 从数据库中读取出来好友的数据之后,系统将其存放在friendnames数据结构中,查看功能可通过访问friendnames的成员变量来实现。
  1. 查看资料运行界面如下:

5.4.4 删除好友

用户可以删除好友列表中指定的好友,客户端确认用户操作后向服务器发送删除请求,服务器收到该请求,连接数据库表friend,并删除用户及该好友的纪录。若删除成功,则向客户端返回成功消息,通知用户。

6用户手册

    6.1 系统的运行环境

  6.1.1 硬件要求

  1. CPU速度在500MHz以上;
  2. 内存在64MB以上

6.1.2 软件环境

  1. Windows 2000/XP 操作系统;
  2. SQL Server 2000数据库系统;
  3. Eclipse开发工具(Eclipse3.0.1以上版本)
  4. JDK1.4.2-06以上

6.2 系统的功能简介

由客户端程序界面可知,本网络通信系统包含以下主要功能:

  1. 用户注册;
  2. 用户登录;上下线通知;
  3. 查找好友;查看好友资料;
  4. 添加好友;直接添加好友;添加好友应答;删除好友;
  5. 好友列表;更新好友列表;
  6. 发送消息;接收消息;发送文件,接收文件,接收陌生人信息;

6.3 系统的运行和操作指南

  1. 完成全部设计后,首先启动SQL数据库服务器。
  1. 打开Eclipse,在Eclipse中运行 服务器端程序server.java

      运行服务器端界面如图:

  1. 然后运行客户端New.java运行如图所示:

说明:因为本系统的测试在同一个机子,所以需要打开两个客户端。

  1. 完成登录以后,用户之间就可以通信了。

系统特色与不足

7.1 系统特色

本系统是应用计算机网络通信技术和JAVA网络编程的基础知识,利用Eclipse开发工具开发而成的一个小型的基于JAVA的Web通信系统。

系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器 、应用程序服务器端、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的通信开销。系统设计主要应用了TCP/IP协议,UDP协议和Socket套接字以及Java多线程机制编程技术。

Eclipse安装包集成了Java开发环境的插件JDT,所以Eclipse默认是一个和JBuilder类似的Java开发工具,但Eclipse并不仅仅是Java开发工具,我们只需安装C/C++插件(简称CDT),它就可以作为C/C++开发工具来使用。只要有相应的插件就可以作为其他语言的开发工具。另外,Eclipse是开放源代码的软件,它可以使我们阅读到最顶级的Java源代码,学习最优秀的Java技术。

7.2 系统不足

  1.  系统有些细节方面还有待于完善。比如注册新用户时要自动生成用户号码,在发送消息时,系统的各个运行界面应该更加美观等等。
  2. 现在这种通讯工具已经不仅仅只是能上网聊天交流这样简单了,日后,聊天软件的发展趋势,更要集合网络电视电台,邮件的收发,新闻杂志的浏览,视频传输,音频聊天等等功能。所以本系统还需要增加很多的娱乐功能,比方说音频聊天,上网玩游戏,浏览网页等功能。
  3. 系统对网络通信安全方面的设计不足。
  4. 在速度性能方面,网络通信系统提出了更高的要求。在网络连接的薄弱环节I/O

通信方面,要求能够实现无堵塞的,顺畅的数据读写。在面对几百个甚至更多的用户客户端同时发出连接信息的情况下,服务器要求能够保持高性能的并发处理机制,迅速的完成并发请求的处理和发送任务。本系统在这速度性能方面有待于改进。

 基于以上的不足,系统还有待于进一步的完善,还要多熟练Java Swing图形设计,做出精美的画面,学习更多优秀的Java的网络编程技术,不断完善系统。

7.3 设计收获和心得

在毕业设计短暂的几个月中,通过自己动手做设计,我基本熟练掌握了软件开发的整个过程,把我们四年学得知识都融会贯通在一起了,大大提高了我的理论联系实际的能力和动手能力。

从一开始的需求分析,到总体设计,再到详细设计,直到最后的测试,这个过程需要绝对的细心和耐心和信心。为了争取系统做的比较完善,我们需要考虑到每一个可能出现异常的情况,在调试程序过程中,可能调试很长时间也出不来成果,心情烦躁是难免的,每当这时我就告诉自己不要着急,耐心点,再耐心点,我一定能找到错误,找到错误出处后再去不断的尝试各种可能的解决方案,直到出现令我们满意的成果。有时实在调试不出来了,我就会放一放这个问题,以待以后解决。在不断的深入设计过程中,有时就会突发灵感,一下子就解决了以前遗留的问题,虽然问题可能比较简单,但是这时我真的有一种小小的成就感!这大大增加了我的信心,使我不断的自我鼓励。通过本次毕业设计不仅使我对系统开发有了深入的了解,而且我的编程能力也有了较大的提高。

我在设计过程中也遇到了很多自己无法解决的困难,但是通过指导老师和同学的帮助以及自己的努力,最终还是顺利地把困难一个一个解决掉,真正体验到了“人多力量大”的好处。

    我认为一个系统的设计,不可能一步到位,还需要不断完善和补充;同时,系统中还存在许多问题,有待在日后的应用实践中发现和解决。总之,通过这次毕业设计,不仅增强我的动手能力和理论联系实际的能力 ,还使我更加坚信:一定要按部就班,一步一个脚印,踏踏实实的去做事,养成勤学好问的好习惯,才会不断的进步!

  论

网络通信在人们的日常生活中起着非常重要的作用 ,人们可以利用网络通信技术进行即时的信息交流。

本课题就是应用了计算机网络通信技术和JAVA网络编程的基础知识,采用Eclipse开发工具,以JAVA为平台,并使用SQL Server 2000管理数据库数据开发出的基于Socket的网络即时通信系统。系统采用客户机/服务器(C/S)的模式设计,是一个三层C/S结构,数据库服务器层 、 应用程序服务器端 、应用程序客户端,按照此设计思想,系统采用C/S结构,可以将任务合理分配到客户机端和服务器端 ,从而降低了系统的通信开销。此系统共分为两个模块:客户端模块和服务器端模块。从操作简便、界面美观、灵活实用的用户要求出发,设计开发的网络通信系统可以实现用户注册,用户登录,消息通信,接收和发送文件,好友管理等主要功能。

日后,聊天软件的发展趋势,不仅仅是以聊天为主要内容了 ,更要集合网络电视电台,邮件的收发,新闻杂志的浏览,个人形象展示,视频传输,音频聊天等等功能。网络通信系统将越来越娱乐化。

考 文 献

[1]  Chad Darby,John Griffin.网络编程指南.北京:电子工业出版社,2002(3).

[2]  杨绍方.Java编程应用技术与案例.北京:清华大学出版社,2000(11).

[3]  张晓东,JAVA数据库高级教程.北京:清华大学出版社,2000(2).

[4]  David M.Geary.Java2图形设计卷二:SWING.北京:机械工业出版社,2003(1).

[5]  Elliotte Rusty HaroldJava 网络编程.第3版.北京:中国电力出版社,2005(2)

 [6]  宋现锋.趣味程序导学Java2.北京:清华大学出版社,2002(1).

[7]  萨师煊,王珊.数据库系统导论(第三版).北京:高等教育出版社,2000(2).

[8]  印旻.Java与面向对象程序设计教程.北京:高等教育出版社,2000(9).

[9]  刘亚滨,杨红,精通Eclipse.北京:电子工业出版社,2004(6).

[10] 张筑生.Eclipse编程技巧与实例.北京:清华大学研究所,20055).

[11] 陈刚.Eclipse从入门到精通.北京:清华大学出版社,2005(6).

[12] 宁书林,李凯,许新龙.Java2程序设计技能百练.北京:中国铁道出版社,2004(8).

[13] 孙一林,彭波.Java网络编程实例.北京:清华大学出版社,2003(6).

[14] 谢希仁.计算机网络第四版.电子工业出版社,2004(6).

 [15] 飞思科技产品研发中心.Java TCP/IP 应用开发详解.电子工业出版社,20021).

[16] 夏创业,邓劲生.新型Socket应用编程接口技术.国防科技大学,2005(3)

[17] 朱喜福,郭逢昌,赵玺.Java 网络应用编程入门.人民邮电出版社,2005(5).

[18] 旺晓平,俞俊,李功.Java网络编程.北京:清华大学出版社,2005(9).

参考资料:

java毕业设计——JAVA网络通信系统的研究与开发(论文+源代码+开题报告).zip

Java毕业设计174例,包含部署视频-CSDN博客

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Java企业人事管理系统是一个基于Java语言开发的应用程序,旨在帮助企业管理人事信息,包括员工档案、薪资福利、考勤管理等方面。本系统设计实现毕设将围绕以下几个方面展开。 首先,需要对企业人事管理系统的需求进行分析和调研,了解用户的实际需求和使用场景。通过与企业人事部门的沟通和调研,收集相关数据和信息,为后续的系统设计和开发提供依据。 其次,需要进行系统设计工作,包括数据库设计系统架构设计、界面设计等。在数据库设计方面,需要根据企业的实际情况建立员工信息表、部门信息表、薪资福利表等,保证数据结构的合理性和完整性。在系统架构设计方面,需要选择合适的技术框架和组件,确保系统的稳定性和性能优化。在界面设计方面,需要根据用户的操作习惯和需求,设计简洁、直观的用户界面,提高用户体验。 最后,需要进行系统实现和测试工作。在实现方面,需要利用Java语言和相关的开发工具进行编码工作,保证系统可以实现各项功能需求。在测试方面,需要进行单元测试、集成测试和系统测试,确保系统的稳定性和功能完整性,同时发现和修复潜在的问题和Bug。 综上所述,Java企业人事管理系统设计实现毕设需要进行需求分析、系统设计系统实现和测试等一系列工作,以确保最终的系统能够满足企业的实际需求,提高人事管理工作的效率和精度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕业课程设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值