[计算机软件及应用]即时通信软件的分析与设计.doc_第1页
[计算机软件及应用]即时通信软件的分析与设计.doc_第2页
[计算机软件及应用]即时通信软件的分析与设计.doc_第3页
[计算机软件及应用]即时通信软件的分析与设计.doc_第4页
[计算机软件及应用]即时通信软件的分析与设计.doc_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于P2P的即时通信软件的分析与设计基于P2P的即时通信软件的分析与设计第一部分 需求分析说明书1 引言1.1 P2P介绍P2P是英文Peer-to-Peer(对等)的简称,又被称为“点对点”。“对等”技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。P2P还是英文Point to Point (点对点)的简称。它是下载术语,意思是在你自己下载的同时,自己的电脑还要继续做主机上传,这种下载方式,人越多速度越快但缺点是对硬盘损伤比较大(在写的同时还要读),还有对内存占用较多,影响整机速度。图1.1 P2P模式点对点技术(peer-to-peer, 简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。但P2P并非纯粹的点对点技术,实为解作群对群(Peer-to-Peer)。在虚拟私人网络VPN (Virtual Private Network)中,也有P2P这个名称,它才是真正解作点对点(Point-to-Point)。 下面试图用三句话来揭示P2P的影响: 对等联网:是只读的网络的终结(Peer-to-peer is the end of the read-only Web) 对等联网:使你重新参与互联网(Peer-to-peer allows you to participate in the Internet again) 对等联网:使网络远离电视(Peer-to-peer steering the Internet away from TV)如上文所言,P2P不是一个新思想,从某些角度看它甚至是整个最初创建互联网的最基本的思想。我们不妨花时间作一点回顾。P2P的分类依中央化程度分为纯P2P、杂P2P、混合P2P 纯P2P:* 节点同时作为客户端和服务器端。 * 没有中心服务器。 * 没有中心路由器。 * 如Gnutella,最初的eDonkey2000。 杂P2P:* 有一个中心服务器保存节点的信息并对请求这些信息的要求做出响应。 * 节点负责发布这些信息(因为中心服务器并不保存文件),让中心服务器知道它们想共享什么文件,让需要它的节点下载其可共享的资源。 * 路由终端使用地址,通过被一组索引引用来取得绝对地址。 * 如最原始的Napster。 混合P2P:* 同时含有纯P2P和杂P2P的特点。 * 如Skype,现在的eMule,天网Maze,Amazingstore等。 依网路拓扑结构分为结构P2P、无结构P2P、松散结构P2P 结构P2P:* 点对点之间互有连结资讯,彼此形成特定规则拓扑结构。 * 需要请求某资源时,依该拓扑结构规则寻找,若存在则一定找得到。 * 如Chord、CAN。 无结构P2P:* 点对点之间互有连结资讯,彼此形成无规则网状拓扑结构。 * 需要请求某资源点时,以广播方式寻找,通常会设TTL,即使存在也不一定找得到。 * 如Gnutella。 松散结构P2P:* 点对点之间互有连结资讯,彼此形成无规则网状拓扑结构。 * 需要请求某资源时,依现有资讯推测寻找,介于结构P2P和无结构P2P之间。 * 如Freenet。 BT说到P2P,就不能不提BT,这个被人戏称为“变态”的词几乎在大多数人感觉中与P2P成了对等的一组概念,而它也将P2P技术发展到了近乎完美的地步。实际上BitTorrent(中文全称比特流,简称BT)原先是指一个多点下载的P2P软件。它不像FTP那样只有一个发送源,BT有多个发送点,当你在下载时,同时也在上传,使大家都处在同步传送的状态。应该说,BT是当今P2P最为成功的一个应用。 如果解释一下的话,BT首先在上传者端把一个文件分成了多个部分,客户端甲在服务器随机下载了第N部分,客户端乙在服务器随机下载了第M部分。这样甲的BT就会根据情况到乙的电脑上去拿乙已经下载好的第M部分,乙的BT就会根据情况去到甲的电脑上去拿甲已经下载好的第N部分。 有一句话可以作为BT最为形象的解释就是:“我为人人,人人为我”。而最初听到此概念时,有人对我说,别用BT,会坏你的硬盘的!大概指的就是前一句。现在看来,没有贡献怎么会有获取?这大概最可以概括BT下载传输的精髓。工具软件BTJoy,将这一技术以软件的形式完美起来,这个诞生仅有一年的软件已经迅速热遍了整个网络对于BT下载的爱好者来说,120G的硬盘都可以被迅速塞满! Usenet除了BT下载,另外一种下载方式就是利用Usenet上的资源。有人把他理解成p2p,其实并不正确。这种下载方式在国内并不为人所知,但在国外非常流行。主要原因是Usenet上的资源大多数是英文的或者其他语言,所以要求用户具有一定的英文水平。Usenet上的资源可以说是全球性的,而且下载速度极快,IP匿名,因此在西方国家是最受欢迎的网络下载工具。在新浪上可以下载到Usenet的工具,是非常好用的一款Usenet软件。1.2 即时通信即时通信(IM)是指能够即时发送和接收互联网消息等的业务。1998年即时通信的功能日益丰富,逐渐集成了电子邮件、博客、音乐、电视、游戏和搜索等多种功能。即时通信不再是一个单纯的聊天工具,它已经发展成集交流、资讯、娱乐、搜索、电子商务、办公协作和企业客户服务等为一体的综合化信息平台。随着移动互联网的发展,互联网即时通信也在向移动化扩张。目前,微软、AOL、Yahoo等重要即时通信提供商都提供通过手机接入互联网即时通信的业务,用户可以通过手机与其他已经安装了相应客户端软件的手机或电脑收发消息。2 系统的功能结构基于P2P的即时通信系统的功能应该有以下几个基本的功能模块组成。 登录认证与注册创建的功能; Peer间的即时通信的功能; 文件交互功能; 文件共享功能; 其他的功能。1、 登录认证与注册创建的功能在程序启动后有一个登录与注册的界面,在这个界面上用户可以有两种选择。 可以根据当前的频道列表显示的信息,选择当前已有的一个P2P频道,输入此频道的认证密码后,加入该频道。 用户可以创建一个新的P2P频道,输入用户名称、频道的名称和认证密码后,一个新的频道就创建好了。2、 Peer间的即时通信功能Peer间的即时通信,确切的说应该是同一频道内的所有Peer间的通信,这个通信过程包括如下两个方面: 一方面:所有Peer间的广播通信,类似于多人聊天室,某一Peer发布的信息,在同一P2P频道内的其他所有Peer都能接受到此信息。 另一方面;两个Peer间的私有通信,通信过程是再两个Peer之间进行的,其他Peer不参与这一过程,通信的消息内容对其他Peer不可见。3、 文件交互功能文件交互功能包括文件的发送与接收,Peer一端可以向同一频道内的所有Peer发送文件,也可以接收同一频道内的其他任何Peer发送的消息。也就是说Peer可以在频道内广播发送文件,这样Peer之间可以进行任意的文件和数据的交互。4、 文件共享功能文件的共享功能,指的是Peer一端可以将本地的文件目录共享出去,这样,在P2P频道内的其他所有Peer都可以访问这个共享目录,也可以从Peer列表中查看其他Peer共享出来的目录。在查看目录的同时,也可以查看共享的文件列表、文件内容等。5、 其他功能除以上的基本功能外,系统还提供了一些其他必须的功能,如清屏操作的功能、系统服务消息、错误提示和系统的运行状态等。基于P2P的即时通信系统的功能结构图如图1.2所示图1.2 系统功能结构图3 系统的运行流程系统的运行流程如图1.3所示图1.3 系统的运行流程4 系统的层次组织结构一个即时通信系统应该有以下几个层次组成: 显示模块:用户的UI操作界面; 功能模块:用于完成即时通信、文件共享、文件传输等基本功能; 消息模块:用于在网络上进行交互的各种数据信息的处理; 网络模块:实现P2P的网络机制。系统的组织结构如图1.4所示图1.4 系统的组织结构即时通行系统的详细介绍如下:4.1界面显示模块界面指的是即时通行系统在PC机上运行所显示的图形用户界面,程序需要一个界面来提供各种操作的入口,利用界面来显示系统的运行过程,而且界面显示的结果要简单、布局合理。 开始界面:程序启动的第一个界面,供用户加入和创建一个P2P频道。 主界面:整个系统的主界面,包括聊天信息的显示、功能菜单、Peer列表等。 文件接收界面:当有peer向你发送文件时,单击文件接受按钮就是弹出文件接收的界面,可以显示文件内容没也可以将文件存储到本地。 私人聊天界面:当两个peer间进行 私人聊天时,会弹出一个私人的聊天界面,这两个peer间就可以进行私人的聊天,聊天信息对其他的peer间是不可见得。 文件共享界面:主要用于peer文件共享的操作,可以显示并查看文件共享目录和文件的详细信息,并提供对共享文件的操作。 文件选择对话框:准确的说他并不是系统所有的显示界面,因为本系统要用到文件发送和文件接收,文件共享,文件存储等操作,所以文件选择对话框的功能主要是方便用户浏览选择文件路径和目录。4.2功能模块就整个系统而言,功能有很多,如数据交互,文件共享,私人聊天是等,在这些功能上,文件共享和私人聊天在系统运行中,需要弹出单独的操作界面来执行这两个功能,这样,就需要有独立的功能子模块去进行实现。所以,在功能模块中主要就实现两个功能:分别是文件共享的功能和私人聊天功能。 文件共享功能:此功能包括两个方面,一方面来自主动共享本地的目录,设置共享,一方面是查看其他peer的共享目录,也就是查看共享。 设置共享:当用户单击主界面中的文件共享按钮时,弹出文件选择对话框,用户可以自由选择本地硬盘中的用户共享的目录,选择完成后,此目录的文件就全部共享出去了,其他的peer就可以查看。 查看共享:需要查看当前P2P频道中存在的共享目录时也很简单,只需在peer列表中选择你要查看的peer节点并点右击,然后在弹出的快捷菜单中选择“查看共享目录”选项即可,这时就会弹出次peer共享目录的情况。 频道广告功能:向网络中进行定时的广播,奖品到信息广播给所有的结点。 私人聊天功能:私人聊天就是实现纯粹的P2P通道,整个通信过程在两个Peer之间完成,无需服务器的中专,在peer列表中,选择你要与之同心的peer结点名称并点击,在弹出的快捷菜单中选择“进行私人通信”选项,就会弹出一个聊天对话框。用户就可以在此窗口中进行1对1的即时回话了。4.3消息模块消息模块在本系统中是一个抽象的概念,系统中所有需要由网络发送的东西,都由消息模块来完成。根据系统的设计目标,在消息模块中要实现的基本需要如下: 频道消息:在本系统中是通过一些P2P的频道来模拟P2P的网络的,每个P2P的频道就是一个为想的P2P的网络。Peer结点与频道之间的交互都由频道消息来为难成,因而,频道消息简单的说就是peer结点饭送到P2P频道中的文本消息,包括频道名称信息,用户输入,输出信息等。 私有聊天消息:私有聊天消息主要有两个Peer节点之间的信息交互,是两个peer节点之间相互发送的文本消息。 分享列表消息:此消息主要用于文件共享的功能上,确切的说他并不是一个真正的消息,而是一个特定的结构,用来告诉P2P频道中的每个peer结点当前共享的文件消息。可以想象成它类似于这样一条消息:“嗨,朋友们,这是我的共享文件清单:XXX,YYY。”。 文件消息:此消息主要用于文件的交互传输,描述了一个为保健信息被一个peer结点饭送到网络中的消息,当然,这个消息中也包括了文件的内容。 服务消息:石油系统发送的消息,用于消息的同步和管理。4.4网络模块网络模块主要用于实现底层的P2P机制,通过基于P2P的网络实现机制,是整个即时通信系统完全架构在点对点的基础上,系统不再有中心服务器的概念了,消息在两个对等的节点间交互,再也无需服务器的中转和转发。网络模块的主要通过多播机制来实现的。 网络分发:主要用于通过网络来发送消息,它并不关心消息是否被发送出去,而具体的消息发送有多点网络分发来完成。 多点网络分发:它是一个真正的用于发送消息的功能模块,通过多点的Sockets向网络中发送数据。5系统的用例分析5.1 系统的通信功能部分的用例分析1. 用户的登陆与注册的当一个Peer节点要加入该聊天系统,有两种方法:一种是,登陆一个已有的频道,但加入需要认证密码;另一种是,注册一个新的频道并加入。其用例图如图1.5所示图1.5 用户的登陆与注册的用例 2. 同一频道内的广播会话在同一频道内,所有Peer间的会话都是以广播的形式进行的,也就是说频道内某一Peer发出的消息能被同一频道内的其他所有Peer节点接收,频道内的广播会话的用例图如图1.6所示:图1.6同一频道内的广播会话的用例图3. Peer间的会话Peer间的私有会话,指的是两个Peer间的独立会话,有两个对等的Peer直接建立连接,进行会话。它们之间的会话内容对于其他的节点是不可见的。Peer间私有会话的用例图如图1.7所示:图1.7 Peer间私有会话的用例图5.2系统中文件传输部分的用例分析1. 文件发送本系统中的文件的发送是以广播的形式发送的,也就是某一Peer节点发送的文件,可以同时被其它所有的Peer节点所接收,文件发送的用例图如图1.8所示图1.8 文件发送的用例图2. 文件接收当一个P2P频道内有Peer发送文件时,其他的任何Peer都可以执行文件接收的功能,接收文件的用例图如图1.9所示:图1.9 接收文件的用例图3. 文件共享本系统的文件共享有两个过程,一是将本地的文件共享出去,另一个是查看其他Peer节点所共享的内容。文件共享的用例图如图1.10所示:图1.10 文件共享的用例图第二部分 概要设计说明书1 引言1.1 编写目的概要设计说明书又可称系统设计说明书,这里所说的系统是指程序系统。编制的目的是说明对程序系统的设计考虑,包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计和出错处理设计等,为程序的详细设计提供基础。概要设计说明书是概要设计阶段应该完成的文档,是对待开发的软件项目的总体规划,是对待开发软件的功能的概述,以及实现某项功能的大致方法。 一个好的概要设计对参与软件项目开发的人员是一个很好的指导,告诉开发人员待开发软件项目的功能实现以及实现的方法,是开发人员准确把握开发方向的方向标。1.3 背景最近几年,对等式网络模型p2p开始受到重视,成为最近的技术热点。p2p即peer to peer,称为对等连接或对等网络,它与传统的客户端/服务器(c/s)或浏览器/服务器(b/s)模式相比,最大的不同是降低了对服务器的依赖,在p2p网络中各peer之间的关系是对等的,peer同时具有client和server的特点。它们可以直接通信,进行文件传输,无需依赖集中式服务器或资源就可完成。p2p技术将在网络尤其是宽带网络方面具备强大的应用潜力,2002 legend world大会上中科院计算机所的李国杰所长对p2p技术与网格技术的融和做出了非常有远见的预测,国外p2p网络流量占据了整个网络流量的40,国外p2p网络注册用户超过3亿以上这些都是有力的证据,从试验科学的角度来看,p2p技术是因为解决了互联网模型中的弱链接模块的信息传递这个障碍,使得互联网的信息流动更加通畅才使他具备了这样强大的生命力和应用前景。目前,P2P 技术的应用主要是在文件共享和即时通讯方面这两个方面。所谓即时通讯,其实指的就是诸如oicq、icq等被称为在线聊天的软件。本文的概要设计主要是通过各种面向对象的类图,活动图,时序图,动作图来分析P2P内部的工作环境和流程。2 总体设计2.1需求规定要实现一个基于P2P技术的即时通信系统,就需要将系统的设计目标,功能需求与整个结构有机的结合起来,在不同的层次上实现不同的功能,这样整个系统的需求也就确定。2.2运行环境操作系统:windows 和 Linux均可编译环境:装有jdk1.6以上开发工具:MyEclipse或者Eclipse网络环境:局域网 或Internet网2.3基本设计概念和处理流程要对系统进行整体上的组织与了解,就要对系统的整个执行流程有清晰的了解,就像盖一栋高楼。在正式建楼之前,建设者建造的顺序和过程了然于心,什么时候打地基,是么时候发布,什么时候装修等,应该有严格的执行顺序。构建一个程序也一样,只有清晰地设定程序的执行流程才能有效的兼顾各个细节,统一调配各个模块。这样才能保证程序的健壮,不至于漏洞百出。执行以下流程。1. 系统起步进入流程(2)。2. 启动用户登录/注册,如果已经有一个则执行步骤3,如果用户这侧一个新频道则执行频道5,否则执行步骤22.3. 刷新当前的频道列表,如果频道列表没有频道信息,则执行步骤5,否则执行4.4. 从频道列表选择一个要加入的频道,输入此频道的密码,则执行5,和自己的用户名。如果认证成功则执行步骤6,否则执行步骤22.5. 输入一个新频道的名称和注册密码,注册一个新的频道,单机“确定”执行步骤6.6. 进入频道的主窗口,如果在频道的主窗口的Peer列表中显示有其他的Peer信息,就执行步骤8-9的反复执行过程。7. 此频道中的有一个以上的Peer,就可实现Peer的通信了,具体的交互过程有8-19完成。8. 共享文件目录。9. 发送文件。10. 接收文件,11. 建立私人会话,从列表中找到一个Peer执行通信操作,可以选择私人聊天。12. 查看共享,如果有则到14,否则执行步骤15.13. 清屏。14. 弹出次Peer的共享目录。可以查看共享文件列表,再次界面中执行步骤17 和18.15. 弹出提示信息,会提示Peer没有共享目录,16. 在接受的文件弹出界面中可以查看接受的信息,执行步骤17 1817. 单击列表中的某一文件名,可以在界面的另一区域显示此文件的内容。18. 右击列表的某以文件,可以存储到本地。19. 两个Peer间的可以在私人聊天界面中进行Peer间的会话。20. 等待其他Peer加入此频道。21. 所有的Peer退出,频道关闭,执行步骤2222. 程序退出。2.4结构基于P2P的即时通信系统的功能应该有以下几个基本的功能模块组成。 登录认证与注册创建的功能; Peer间的即时通信的功能; 文件交互功能; 文件共享功能; 其他的功能。2.4.1界面显示模块界面显示模块主要用于系统运行过程中所有界面的显示,根据需求分析的说明,只要有以下几个类组成。这些类的组成方式、类的命名及功能说明如表2.1所示。表2.1 界面显示模块的类设计及功能描述组织方式类名功能说明Pakage p2p.chat.uichatStart系统运行的开始界面,显示用户登录一个已有的频道或是注册一个新的频道。mainframe系统的主界面,显示peer列表,会话信息和相应的菜单工具条 privateConvFrame显示Peer的私人聊天界面,有一个基本的消息输入框和会话框。recFilesFrame用户接受文件的窗口,此界面可以显示文件的内容,也可以利用右键操作将文件存储到本地。UerShareFramePeer节点的文件共享显示界面,可供现实的文件目录和文件内容。Filedialog文件对话框,用于供用户浏览本地目录,选择所需文件。用户的UI操作界面的类图如图2.1所示图2.1用户的UI操作界面的类图2.4.2 功能模块本系统除了主界面所展示的基本功能外,还需要另外的两个子功能,分别为处理文件共享、处理Peer间的私人会话。那么功能模块就对应着两个类,这些类的组成方式、类的命名及功能说明如表2.2所示。表2.2 功能模块的类设计及功能描述组织方式类名功能说明Pakage p2p.chat.funFileShariing用于处理文件共享的功能,主要是查看其他Peer的结点共享文件目录,显示文件内容,将文件共享下载到本地。PrivateConversation用于处理两个Peer间的私人会话,有消息输入框和内容显示,当有新消息来时,弧自动然出对话框。类图如图2.2所示图2.2图 消息模块本系统中所有通过网络交互的消息都由消息模块开完成,根据系统的需求,有多个不同的消息类型,消息模块中类的组织方式、类的命名及功能说明如表2.3所示。表2.3 消息模块的类设计及功能描述组织方式类名功能说明Pakage P2P.chat.messageChannel Message频道信息,是由Peer结点发送到P2P的文本信息PrivateMessage私人会话信息,有一个Peer结点发送到另一个Peer结点。SharingListMessage共享链表信息,用来告诉某一个P2P的频道中的每一个列表。AttachmentMessage附件信息,代表了用户将文件发送到网络中的信息,也包括显示文件的信息。ServiceMessage节点信息,用来显示和表明用户结点的一些信息。消息模块的类图如图2.4所示图2.4 消息模块的类图2.4.4 网络模块网络模块用于实现底层的P2P机制,用于发现网络中的Peer节点,根据需求的规定和实现机制的分析,这一模块主要由3个类来完成,网络模块中类的组织方式、类的命名及功能说明如表2.4所示表2.4 网络模块的类设计及功能描述组织方式类名功能说明Pakage NetWorkDispatcher网类分发,构建一个网络分发型主要用于处理数据的加密,解密及向所有的积点分发信息。MuticastDispatcher多点分发,网络分发的具体实现,主要通过点Sockets在网络中发送数据。ChanAdvertiserThread频道广告线程,一个定向想网络中的广告当前的频道的类,多线程执行,不停的循环。网络模块的类图如图2.5所示图2.5 网络模块的类图3 接口设计3.1用户接口 (1)用户请求一个频道的建立,注册。 (2)用户申请加入频道,登录。3.2外部接口 每个Peer播放自己的IP地址和端口,让周围的主机找到自己IP地址,然后可以和别的其他的Peer通信。3.3内部接口(1)实现peer到peer的单点通信。(2)实现多Peer广播(3)文件共享。(4)文件传输。4 运行设计4.1运行模块组合网络模块消息模块显示模块功能模块4.2运行控制 管理模块:统一管理对象对其他模块进行调度。4.3运行时间 软件从打开到出现界面花费7-8秒第三部分:详细设计和编码1引言1.1 编写目的详细设计的根本目的就是如何精确的实现所要求的系统,得出对目标系统的精确描述,从而在编码阶段可以把详细设计报告的描述直接用某种程序设计语言翻译成源程序。详细设计的根本任务是对概要设计阶段划分出的每个模块进行明确的算法描述。本报告中运用面向对象的方法对系统进行详细设计,即使用UML中的活动图、状态图、序列图和协作图对系统进行描述。详细设计说明书的编写为后期的编码阶段的编码提供准备,本说明书为开发人员提供算法的描述。2 系统结构下面通过UML的活动图、状态图、协作图、序列图对系统的结构进行详细的描述。2.1 活动图用户加入频道或创建新频道的活动图如图3.1所示图3.1用户加入频道或创建新频道的活动图用户聊天模块的活动图如图3.2所示图3.2 用户聊天模块的活动图文件共享模块的活动图如图3.3所示图3.3 文件共享模块的活动图文件接发模块的活动图如图3.4所示图3.4 文件接发模块的活动图频道总操作的活动图如图3.5所示图3.5 频道总操作模块的活动图2.2状态图用户登录模块状态图如图3.6所示 图3.6 用户登录模块状态图用户聊天模块状态图3.7所示 图3.7 用户聊天模块状态图文件共享模块状态图3.8所示 图3.8 文件共享模块状态图文件接发模块状态图3.9所示图3.9 文件接发模块状态图频道总操作状态图3.10所示图3.10 频道总操作模块状态图2.3序列图用户聊天模块的序列图如图3.11所示图3.11 用户聊天模块的序列图用户文件共享的序列图如图3.12所示图3.12 用户文件共享的序列图用户文件接发模块时序图如图3.13所示图3.13 用户文件接发模块时序图2.4 协作图用户聊天模块的协作图如图3.14所示图3.14 用户聊天模块的协作图用户文件共享的协作图如图3.15所示 图3.15 用户文件共享的协作图用户文件接发模块协作图如图3.16所示图3.16 用户文件接发模块协作图3 编码网络模块的MulticastDispatcher类的代码如下所示package ;import java.io.IOException;import .DatagramPacket;import .InetAddress;import .MulticastSocket;/* * 此类主要用IP多播技术来发送数据 */public class MulticastDispatcher extends NetworkDispatcher / 选用专门为多播指定的D类IP地址(到55)任选一个即可,用来创建一个多播组public static final String DefaultMulticastGroupIP = ;/ 使用指定的端口(一般选1024以上的端口号)只要是空闲端口即可,用于建立多播套接字。public static final int DefaultMulticastGroupPort = 1314;/ 定义一个接收文件的缓冲区private static final int RecvBufSize = 65536;private MulticastSocket cSock; / 定义多点Sockets,用于IP多播private InetAddress curAddr; / InetAddress来获取本机名称和IP地址信息private int curPort; / 当前端口/ /内部的私有类,用多线程的方法来执行接收过程private class RecvThread extends Thread private MulticastSocket cSock;private NetworkDispatcher Dispatcher;public RecvThread(NetworkDispatcher iDispatcher, MulticastSocket iSock) cSock = iSock;Dispatcher = iDispatcher;public void run() byte inBuf = new byteRecvBufSize;DatagramPacket rPack = new DatagramPacket(inBuf, RecvBufSize);try for (;) cSock.receive(rPack);Dispatcher.DataReceived(rPack.getData(), rPack.getLength(); catch (IOException ex) ex.printStackTrace();private RecvThread rThread;protected void DispatchToAll(byte iBuf, int iSize) throws Exception DatagramPacket dPack = new DatagramPacket(iBuf, iSize, curAddr, curPort);cSock.send(dPack);/* 创建一个新的MulticastDispatcher实例 */public MulticastDispatcher() throws Exception curAddr = InetAddress.getByName(DefaultMulticastGroupIP);curPort = DefaultMulticastGroupPort;cSock = new MulticastSocket(curPort);cSock.joinGroup(curAddr);rThread = new RecvThread(this, cSock);rThread.start();网络模块的MulticastDispatcher类的代码如下所示package ;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.security.Provider;import java.security.Security;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.CipherOutputStream;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.PBEKeySpec;import javax.crypto.spec.PBEParameterSpec;import javax.crypto.spec.SecretKeySpec;import p2p.chat.Manager;import p2p.chat.message.Message;import vider.SunJCE;public abstract class NetworkDispatcher / 定义两静态的常量,用byte类型的字符表示,用不标只数据是否需要加密。private static final byte BLOCK_ENCRYPTED = (byte) 0xba;private static final byte BLOCK_UNENCRYPTED = (byte) 0xab;private boolean keySet = false;private Cipher encCipher;private Cipher decCipher;SecretKeySpec keyIV;private PBEParameterSpec paramSpec;private SecretKey secretKey;/ 定义一个字节类型的随机串private static byte salt = (byte) 0xc9, (byte) 0x53, (byte) 0x67,(byte) 0x9a, (byte) 0x5b, (byte) 0xc8, (byte) 0xae, (byte) 0x18 ;public void SetKey(String iKey) if (iKey = null | iKey.length() = 0) keySet = false;return;keySet = true;try Provider sunJce = new SunJCE();Security.addProvider(sunJce);paramSpec = new PBEParameterSpec(salt, 20);PBEKeySpec keySpec = new PBEKeySpec(iKey.toCharArray();SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(PBEWithMD5AndDES);secretKey = keyFactory.generateSecret(keySpec);encCipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);decCipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);/ / catch (Exception ex) ex.printStackTrace();public int GetMaxFileSize() if (keySet)return decCipher.getOutputSize(65000);elsereturn 65000;/* * 构造方法,执行数据加密 */protected NetworkDispatcher() try encCipher = Cipher.getInstance(PBEWithMD5AndDES);decCipher = Cipher.getInstance(PBEWithMD5AndDES); catch (Exception ex) ex.printStackTrace();protected abstract void DispatchToAll(byte iBuf, int iSize)throws Exception;protected void DispatchToAll(byte iBuf) throws Exception DispatchToAll(iBuf, iBuf.length);public void DispatchToAll(Message iMsg) try ByteArrayOutputStream bOut = new ByteArrayOutputStream();boolean EncData = (keySet & !iMsg.DontEncrypt();/ 根据数据信息的不同对加密要求的不同,执行不同的写入操作if (EncData)bOut.write(BLOCK_ENCRYPTED);elsebOut.write(BLOCK_UNENCRYPTED);OutputStream underlayingStream = bOut;if (EncData)underlayingStream = new CipherOutputStream(bOut, encCipher);ObjectOutputStream ooStream = new ObjectOutputStream(underlayingStream);ooStream.writeObject(iMsg);ooStream.close();byte bb = bOut.toByteArray();DispatchToAll(bOut.toByteArray(); catch (Exception ex) ex.printStackTrace();protected void DataReceived(byte iBuf, int iLen) try / 接收加密数据时的处理if (iBuf0 = BLOCK_ENCRYPTED) if (!keySet)return;/ 数据解密过程byte outBuf = new bytedecCipher.getOutputSize(iLen - 1) + 1;iLen = decCipher.doFinal(iBuf, 1, iLen - 1, outBuf, 1) + 1;iBuf = outBuf; else if (iBuf0 != BLOCK_UNENCRYPTED)return;ByteArrayInputStream bIn = new ByteArrayInputStream(iBuf, 1,iLen - 1);ObjectInputStream ooStream = new ObjectInputStream(bIn);Object msgIn = ooStream.readObject();ooStream.close();Message recMsg = (Message) msgIn;Manager.GetInstance().ParseMessage(recMsg); catch (BadPaddingException ex) try decCipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec); catch (Exception exc) catch (Exception ex) ex.printStackTrace();系统的管理类Manager如下所示:package p2p.chat;import java.io.File;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;import java.util.TreeMap;import javax.swing.JOptionPane;import p2p.chat.fun.ChanAdvertiserThread;import p2p.chat.fun.FileSharing;import p2p.chat.fun.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论