网上聊天室的设计与开发课程设计.docx

上传人:b****3 文档编号:12647520 上传时间:2023-04-21 格式:DOCX 页数:40 大小:230.35KB
下载 相关 举报
网上聊天室的设计与开发课程设计.docx_第1页
第1页 / 共40页
网上聊天室的设计与开发课程设计.docx_第2页
第2页 / 共40页
网上聊天室的设计与开发课程设计.docx_第3页
第3页 / 共40页
网上聊天室的设计与开发课程设计.docx_第4页
第4页 / 共40页
网上聊天室的设计与开发课程设计.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

网上聊天室的设计与开发课程设计.docx

《网上聊天室的设计与开发课程设计.docx》由会员分享,可在线阅读,更多相关《网上聊天室的设计与开发课程设计.docx(40页珍藏版)》请在冰豆网上搜索。

网上聊天室的设计与开发课程设计.docx

网上聊天室的设计与开发课程设计

课程设计

 

题目:

网上聊天室的设计与开发

 

简介:

对等(P2P)网络与传统的客户机/服务器或多层服务器网络不同,对等网络中的对等机是彼此直接通信的。

这种通信无需依赖集中式服务器或资源就可完成。

在P2P网络中,通过对等机之间的交互操作就可以完成工作,共享信息。

通过创建有潜力展示非常高的可用性和容错能力的计算资源网络,P2P体系结构使真正的分布式计算成为可能。

传统的客户机/服务器和多层次体系结构已经有很成熟的技术了,而采用P2P体系结构的系统则还方兴未艾。

JXTA是为了构建P2P网络而制订的一组协议,是解决构建P2P网络必须要解决的问题的方法。

在创建网上聊天室时,可以采用JXTA技术来构建网上聊天系统。

 

第一章引言

1.1课题的提出

1.1.1需要解决的问题

该课题要研究的是采用JXTA技术来创建网上聊天室。

该聊天室应该能够体现对等网络(P2P)交互的思想,不依赖于中间服务器而实现用户之间的直接通信,聊天。

聊天的各个用户应该是完全的对等体。

1.1.2对问题的分析以及解决方法的提出

传统的网上聊天室采用的是客户/服务器模式,聊天的用户要想聊天必须首先登陆服务器,在服务器上验证之后,再由服务器向用户提供服务。

这种模式对服务器的性能,以及资源要求比较高。

而本课题研究的是如何采用对等网络(P2P)技术来创建网上聊天室。

由于P2P技术是一项比较新的技术,目前在P2P领域做的比较好的要数JXTA技术了,因此考虑采用JXTA技术来创建网上聊天室。

至于聊天室具体的实现,可以用java,也可以采用C#,本课题立足于java编程语言来实现这个网上聊天室。

1.1.3存在的需要解决的问题

1.该课题研究的是采用P2P技术来构建网上聊天室,因此在对传统的客户/服务器模式有所了解的基础上,应该发挥出P2P技术的特点。

所以必须对P2P技术很熟悉。

2.P2P技术是一个比较笼统地概念,要完成P2P技术的聊天室,必须选定一个支持P2P技术的开发平台。

在此平台下来进行聊天室的创建。

3.创建的聊天室应该能够实现各个用户之间的实时交互,并且具有C/S模式聊天室的一些基本功能。

并能切实的发挥出P2P技术的优势。

1.2JXTA技术的背景以及采用该技术创建网上聊天室的可行性

对等网络P2P(PeertoPeer)是因特网实现下一次飞跃的关键,在P2P网络模式的研究领域里,JXTA(juxtapose,并行)作为一种全新的P2P网络解决方案已经日益受到关注。

1.2.1 P2P概述

P2P(PeertoPeer)技术,中文译为对等互联或点对点技术。

在P2P网络中没有指定的客户机(Client)、服务器(Server)的概念,任何节点都可能成为客户机或服务器。

从本质上说,P2P网络提供了一种在不需要超强中心服务器情况下将各个PC机联接起来的解决方案。

目前,大多数分布式网络都采取客户/服务器模式,在这种模式中,客户请求服务,服务器提供服务。

这种模式是集中式网络模式的典型代表,整个网络完全依赖于中心节点—服务器来提供服务,一旦服务器出现故障,整个网络则近乎瘫痪。

不同于客户/服务器模式,P2P网络是一种分散式的网络模式,如图1所示。

在这种网络模式中不存在固定的客户、服务器,网络中的每一个实体称为对等体(Peer),它们具有对等的地位,这意味着任何实体都可以向其它实体请求服务(作为客户)或给其它实体提供服务(作为服务器)。

图1说明了这种网络模式的结构。

虽然所有的对等体都具有相同的地位,但它们并不具备相同的物理处理能力。

P2P网络中包含着从移动设备到大型主机等各种具有不同能力的对等体。

可移动对等体可能由于自身条件的限制并不能成为其它对等体的服务器,但是这并不会影响整个P2P网络的性能。

当然,这两种网络模式都各有优缺点。

在客户/服务器模式中,随着客户机的不断增加,中心节点—服务器的压力会越来越大。

客户机的增加意味着服务器性能的削弱,而服务器的故障又将导致整个网络的崩溃。

而在P2P网络中,每个实体都是网络活动的积极参与者,它们为P2P网络提供了诸如存储空间、CPU等资源,随着对等体的不断增加,网络的处理能力和存储能力也随之增强,所以并不会出现上述客户/服务器网络的不足。

理论上讲,在P2P网络中只要有一个对等体还处于活动状态便可认为P2P网络仍然可以继续运行,这一点是不同于客户/服务器网络模式的。

当然,P2P网络也有缺陷,它不易管理,它的安全策略、备份策略等都造成了系统管理的复杂。

另外,由于每个对等体均可任意的加入或离开P2P网络,因此,P2P网络协议的交互性较强,这对网络的性能也有一定的影响。

图1-1 Thepeertopeermodel

1.2.2 JXTA技术

1.2.2.1 概述

JXTA技术是由SUN公司在2001年2月提出的一项新技术,主要用于提供P2P程序所需的基础服务。

该技术致力于创建一个通用的平台,以简单而有效的方式构建特定的对等式和分布式服务与应用,使得开发者不需要过多考虑如何解决对等计算的技术问题,而可以专注于如何实现与完善可扩展、互操作性强且具有高可用性的高层应用。

不同的协议、不同的体系结构、不同的实现机制准确的描述了当前P2P解决方案的特点,开发者使用不同的方法开发P2P应用程序,由于没有统一的标准,通用性很差。

鉴于此,Sun公司提出了JXTA技术。

JXTA技术提供了建立P2P网络应用的核心技术,旨在为P2P应用建立一个通用的开发平台。

JXTA技术主要包括一个独立于编程语言、系统平台和网络平台的协议集,这个协议集说明了P2P应用的最基本的需求。

可以说,JXTA是位于操作系统或虚拟机之上、P2P网络服务或应用之下的一个P2P堆栈,它提供了P2P应用所需的核心功能。

目前,JXTA定义了六个协议,但并不是每一个JXTA对等体都必须实现这六个协议,它需要实现哪些协议是由对等体自身的能力决定的。

建立在TCP/IP协议之上的各个应用并不具备交互能力,同样建立在JXTA协议之上的应用也不具备交互能力,要实现这种交互,开发者必须自行开发。

提供基础协议的第一步是要选择大部分平台都可理解的数据表达方式,JXTA采用XML(eXtensibleMarkupLan2guage)来实现数据的表示。

XML语言是一种通用的、独立于语言、独立于平台的数据表达方式,而且它易于转化为其它编码形式。

因此,JXTA用XML语言定义了所有的协议。

1.2.2.2 JXTA的术语

对等体(Peers):

对等体是任意能够使用JXTA协议的实体。

对等体可以表现为一台大型机、一部移动电话、一个进程等等。

每一个对等体都是独立存在的,它和其它对等体进行异步通讯。

对等体组(PeerGroups):

对等体组是一个支持对等体组协议的虚拟的实体。

一般来说,对等体组就是一组相互合作提供公用服务的对等体的集合。

JXTA对一个对等体或对等体组的产生次序并不关心,它也不限制对等体可同时参加的组数以及是否可以生成嵌套的组。

它仅仅定义了如何使用对等体发现协议(PDP)来发现一个对等体组。

对等体组中有一个特殊的组称为世界对等体组(theWorldPeerGroup),它包含所有的JXTA对等体。

虽然所有的JXTA对等体都属于世界对等体组,但并不意味着在这个特殊的组中所有对等体都一定能够相互发现或通信,因为它们可能被网络分隔开来。

默认情况下,每一个对等体都参与到世界对等体组当中。

消息(Messages):

在JXTA网络中,所有的通信都是通过发送和接收消息实现的。

消息用于异步的、不可靠的、单向的传输,它被设计成一个数据报的形式,包含封装体和带有协议头堆栈的主体。

这个封装体包含头部、消息摘要、源端点和目的端点。

一个端点就是一个逻辑目的地,以URL(UniversalRe2sourceLocater)的形式给出。

通过消息层可以将端点映射为物理地址。

每一个协议主体都包含可变数量的字节。

管道(Pipes):

管道是一种异步的、单向的、用于收发消息的虚拟信息通路。

管道有输入管道和输出管道。

一个管道端点可以绑定到多个对等体节点。

通过管道绑定协议(PBP),管道可在运行时刻动态绑定到一个对等体节点。

在不同的时刻,同一管道可以绑定到不同的对等体。

例如,当一个对等体组提供高级的容错服务时,一旦有一个对等体失效,只需要将管道重新绑定到新的对等体上就可以保证系统继续顺利运行。

管道将两个对等体联系在一起,对于发送方来说是输出管道,对于接收方来说它是输入管道,传输是由发送方到接收方的单向传输。

传播管道可以将一个输出管道与多个输入管道相连,这样,任何一个发向输出管道的消息将被发向所有与之相连的输入管道。

管道可以使用任何单播或多播协议以及它们的算法。

实际管道可以串接在一起,串接的每一段可以使用完全不同的传输协议。

代码/数据(Codat即Code/Data):

在JXTA中Co2dat是指文本内容,它可以是代码或数据。

Codats可以被发布、发现或复制。

服务(Services):

对等体和对等体组都可提供服务。

对等体服务是由单个对等体提供的,一旦对等体出现问题,服务就可能不复存在;对等体组服务是由多个对等体提供,因此具有更强的可靠性。

广告(Advertisements):

广告用于发布或发现任何JXTA资源,包括对等体、对等体组、管道或Co2dats,广告表示成XML的形式。

标识符(Identifiers):

标识符用来唯一标识一个实

体(如对等体、广告、服务等)。

JXTA的标识符定义为URN(UniformResourceName)的形式,URN实际就是URI(UniformResourceIdentifier),它可唯一标识资源。

1.2.2.3 JXTA协议

对等体发现协议(PeerDiscoveryProtocol即PDP):

该协议是包括世界对等体组

(theWorldPeerGroup)在内的所有对等体组的默认发现协议。

对等体通过PDP协议发现已经发布的JXTA资源。

由于使用广告表示资源,所以PDP实际上用于发现其它对等体上的广告。

对等体解析协议(PeerResolverProtocol即PRP):

在JXTA网络中,对等体向其它对等体发送请求以寻求所需服务,PRP协议用于标准化请求的格式。

对等体信息协议(PeerInformationProtocol即PIP):

PIP协议使一个对等体能够了解其它对等体的信息和状态。

例如:

可以发送一个Ping消息来判断一个对等体是否已经激活。

如果对等体的属性有名字和值,可以通过本协议得到它的属性信息。

对等体成员资格协议(PeerMembershipProtocol即PMP):

对等体可通过PMP协议加入或离开对等体组。

PMP协议包括四个独立的部分:

申请(ap2ply)、加入(Join)、更新(renew)、取消(cancel)。

每一部分都定义了相应的JXTA消息格式。

权力认证和安全管理可以提供相应等级的保护。

Apply:

如果一个对等体对某一个组感兴趣,便可以向这个组的认证机构发送申请求;Join:

申请之后,对等体就可发送加入请求;Renew:

如果对等体需要更新它在组内的成员信息,可以发送更新请求;Cancel:

对等体可以通过发送离开请求选择离开这个组。

管道绑定协议(PipeBindingProtocol即PBP):

在JXTA环境中,对等体通过管道访问服务,它可以在运行中时时绑定到一个管道的端点以便访问服务。

对等体还可以创建新的服务、绑定到一个存在的管道或解除管道绑定。

这些情况下都用到了PBP协议。

从某种意义上来说,一个管道可以看作是一个支持新建、打开、关闭、删除、发送、接收等抽象操作命名的消息队列。

绑定发生在打开操作阶段,而解除绑定发生在关闭阶段。

端点路由协议(EndpointRoutingProtocol即ERP):

该协议可以保证一个对等体向另一个路由对等体问询到达目的地的可用路径。

一般两个通信的对等体并不直接相连。

例如,两个使用不同网络协议的对等体或被防火墙和网络地址转换(NAT)分隔的对等体。

对等体路由用有效的路由信息来响应请求,通常路由信息是这条路径所经过的网关列表。

1.2.2.4 JXTA体系结构(Architecture)

JXTA软件的体系结构分为三层,其层次结构如图2所示。

图1-2 TheJXTALayer-Cake

从图2可以看出,最底层是平台层即核心层,这一层包含了P2P网络的最基本的要素,如对等体或对等体组(Peer)的建立、资源发现、通信管理(如路由等)和其它一些底层的服务。

中间层是服务层,在这层中提供诸如索引、查找、文件共享、协议转化、授权服务、PKI(PublicKeyInfrastructure)服务之类的高级服务。

这些服务需要大量调用由核心层提供的基本操作。

高层是应用层,它主要提供诸如邮件、存储之类的服务。

当然,一些特性如安全管理在这三层中均有体现并贯穿于整个P2P系统。

JXTA的体系结构与其它分布式网络实现模式的区别主要表现在以下三个方面:

.JXTA使用XML文档来描述网络资源;

.JXTA网络中不使用中心命名机制和中心寻址机制;

.JXTA网络采用统一的对等体寻址机制

1.2.3采用JXTA技术创建聊天室的可行性

由本课题的要求来看,采用P2P技术创建网上聊天室,由于JXTA技术是P2P技术的开发平台,所以,在JXTA平台上可以自己编程实现网上聊天室。

JXTA非常适合编写聊天程序,而且可以有多种实现方法,包括完全的集中式、代理方式到完全非集中式。

而且一个非常有意思的情况是,用JXTA来实现一个集中式的聊天程序非常困难,而实现完全非集中式的聊天程序反而简单,因为JXTA平台本身已经完全解决了底层Peer之间的发现和通信问题。

1.2.4聊天室编程的实现语言的选取

虽然JXTA技术是独立于语言的,可以采用C#或者是java编程语言。

但是在实现该聊天室的时候,采用了java语言作为开发工具。

因为java在开发P2P程序方面有其固有的优势,主要是在各个平台之间的可移植性。

Java提供我们详尽的API,可以建立相当好的平台。

 

1.3课题的目的

本课题目的在于采用现在比较新的技术P2P技术来创建网上聊天室,该聊天室应该能够实现点对点客户直接交互,包括一对一,多对多的用户之间的不依赖于服务器的直接通信。

 

第二章总体设计和概要说明

2.1设计前的准备

2.1.1建立Java环境

使用JXTA首先要建立环境,必须为运行JXTA建立Java环境。

为此需要三个要素:

Java平台,JXTA类库和需要运行的JXTA程序。

首先是建立Java平台。

要提供Java平台,需要Java2标准版(J2SE的1.3.1版或者更高版本),本次设计安装了1.4版的。

对于JXTA编程,还需要Java2软件开发包(SDK)。

在安装了Jdk之后,还需要配置Java环境变量。

其次,是获得JXTA类文件和程序。

JXTA的类库可以从网上站点http:

//download.jxta.org/easyinstall/install.html下载。

由于使用的是Windows操作系统,故下载了可执行(.Exe)文件.。

按照提示进行安装。

为了编程实现的方便,还安装了JCreator3.10。

2.1.2JXTA应用程序配置

在安装了JXTA之后,还需要打开JXTAconfiguratortool(JXTA配置管理器)进行配置,配置的信息保存在本地目录中。

配置信息还包含了一个本地端口号,JXTA应用程序将在该端口上进行监听。

2.2设计思路与模块划分

本次设计将根据聊天室的具体实现功能而将设计分成三个部分来完成,这三部分是:

发现服务通告;构建JXTA管道使得对等体相互通信;使JXTA聊天程序成为服务。

其中使JXTA程序成为服务将在发布通告和JXTA管道进行通信的部分说明。

因为无论是发布通告还是构建管道都是与使JXTA成为服务密不可分的。

本次设计的主要程序包有以下几个:

net.jxta.discovery包

对等体使用net.jxta.discovery包中的发现服务去发现JXTA环境中的资源。

对等体使用发现服务去发现已发布的通告,包括对等组,管道和网络服务的通告。

当发现服务查找到一个新的资源时,就发送发现事件对象。

发现事件被发送到该监听者的DiscoveryEvent()方法。

实现DiscoveryListener接口的对象能够在发现服务中注册,当找到新的通告,它将调用这个已注册对象的DiscoveryEvent()方法,并向该方法传递一个DiscoveryEvent对象。

DiscoveryService接口通过PeerGroup类的getDiscoveryService()方法来获得特定的对等组的发现服务。

应用程序使用getRemoteAdvertisement()方法寻找未缓存的通告。

该方法使用PDP发送发现消息,发现事件监听者通过调用addDiscoveryListener()方法在发现服务中注册,当发现了新的通告,该监听者将被调用。

net.jxta.peer包

该程序包中包含了处理JXTA对等体信息的类,获取对等体信息的过程与发现对等体的过程相同:

先查询本地缓存中的对等体通告,再查询提供远程对等体信息的对等体服务。

net.jxta.peergroup包

JXTA对等体通过调用PeerGroup类的newGroupFactory()方法来加入MyJXTA对等组,该方法返回一个对等组对象。

net.jxta.pipe包

管道是对等体之间进行通信的主要手段。

InputPipe用于读取其它对等体发来的消息,createInputPipe()方法用于创建输入管道。

OutputPipe用于向其它的对等体发送消息,createOutputPipe()方法用于创建输出管道。

当一个输入管道连接到一个输出管道时,管道间的路径必须被解析。

管道路径的解析用OutputPipeEvent类来表示。

 

第三章发现服务通告

3.1通告的使用与构造

3.1.1通告的使用

通告是JXTA的核心,只有通过寻找通告才能发现JXTA的对等体及其资源,而且只有通过发布通告才能向外界提供自己的服务。

通告由抽象类Advertisement表示,每个通告都有一个唯一的类型,用getAdvertisementType()方法获取该类型。

JXTAAPI定义了以下的核心通告类型:

PeerAdvertisement

PeerGroupAdvertisement

PipeAdvertisement

PeerInfoAdvertisement

EndpointAdvertisement

TranseportAdvertisement

获取通告对象有两种途径,首先是创建通告对象。

当发布通告时,必须创建通告对象。

其次,可以通过PeerGroup类的getPeerGroupAdvertisement()方法获取用于创建对等组的通告。

3.1.2通告的构造

通告对应着不同的资源,虽然各种通道的类型不同,但是它们的创建方式相同。

首先,从AdvertisementFactory类获取一个空白的通告文档。

然后使用特定类型的通告内部的方法来设置通告文档中的各个要素。

3.2JXTA发现

聊天的对等体首先要做的是了解其周围环境。

对等体在四周环境中寻找资源,支持自身,访问需要的服务以及支持自己的范围。

用户要找人聊天,首先必须发现并加入聊天组。

当然,不能保证用户进入聊天室的时候,聊天组已经存在,所以peer用户必须好去创建聊天组。

JXTA中的发现是在对等组环境中执行的,每个对等体都会加入到MyJXTA对等组中。

在MyJXTA环境中执行的发现使得任何对等体都可能发现在MyJXTA中发布的任何通告。

由于MyJXTA中的通告的数量十分庞大,因此在MyJXTA中执行发现是是不切实际的。

因此聊天的对等体应该尝试在MyJXTA中发现对等组,然后在更小的对等组内发现其它资源。

3.2.1异步发现机制

JXTA发现使用一种异步机制来发现通告。

想要发现资源的对等体在选定的对等组范围内传播一个发现请求。

该请求的响应是异步接收的。

是否能接收到响应或者什么时候能收到响应是不确定的。

这种不可预料且不可靠的P2P网络使得难以指定超时时间或预知行为。

应用程序的职责在于判断得到相应的时间。

异步编程模型最适合与这种不可靠的P2P网络环境。

异步机制大大简化了错误恢复,因为错误是作为普通情况来处理,而不是作为异常来处理的。

3.2.2发现服务的实现

GroupSearch负责发现对等组,如果没有找到对等组,那么对等体将创建对等组。

GroupSearch类的结构很简单:

1.发现现有的对等组的通告

A.寻找本地缓存中以前发现的通告。

B.发送PDP请求,以发现通告。

这可以使用广播类型机制或者通过联系已知的汇聚对等体来完成,这两种方法都是同步调用。

在后台,API将创建一个新的县城来侦听响应。

随着响应的到来,后台线程将读取它们,并把响应插入到对等体的本地通告缓存中。

C.等待响应得到来。

D.再次查看本地缓存中的响应。

2.如果没有找到现有的PeerGroup,就为之创建一个对等体通告,再根据通告创建PeerGroup组。

3.如果现有的PeerGroup没有找到,就使用发现通告来加入对等组。

下面是执行这些步骤所必须的代码:

packagenet.jxta.myjxta2.search;

importnet.jxta.peergroup.PeerGroup;

importnet.jxta.myjxta2.util.Group;

importnet.jxta.myjxta2.util.GroupNode;

importnet.jxta.discovery.DiscoveryListener;

importnet.jxta.discovery.DiscoveryService;

importnet.jxta.discovery.DiscoveryEvent;

importnet.jxta.protocol.DiscoveryResponseMsg;

importnet.jxta.protocol.PeerGroupAdvertisement;

importjava.io.IOException;

importjava.util.Enumeration;

importnet.jxta.myjxta2.MyJXTA;

publicclassGroupSearch

extendsAbstractSearch

implementsDiscoveryListener{

publicstaticfinalStringATTRIBUTE_NAME="Name";

//定义的ATTRIBUTE_NAME为我们想要搜寻的属性的名称

//定义要搜寻的标题

privatestaticfinalStringTITLE="GroupSearch";

/*对搜寻的描述*/

privatestaticfinalStringDESCRIPTION="groups";

publicGroupSearch(Groupgroup,MyJXTAmyJ

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1