知识大全 基于JXTA的P2P应用开发
Posted 消息
篇首语:要真正了解一个人,需在不幸中考察他。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 基于JXTA的P2P应用开发相关的知识,希望对你有一定的参考价值。
基于JXTA的P2P应用开发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
P P计算被Intel喻为第三代网络革命的 点对点分散式网络架构 JXTA是Sun旨在建立P P通用技术基础的计划 定义了一组P P协议 本文以一个简单的聊天应用为例 介绍基于JXTA的P P应用开发 概述 P P即Peer to Peer 称为对等连接或对等网络 是一种点对点计算模式 JXTA是项目创始人 Sun首席科学家Bill Joy二十多年酝酿的结晶 JXTA技术是网络编程和计算的平台 用以解决现代分布计算尤其是P P计算中出现的问题 JXTA协议是一组为P P网络计算而设计的协议 共六种 这六种协议分别是 Peer Discovery Protocol Peer Resolver Protocol Peer Information Protocol Peer Membership Protocol Pipe Binding Protocol 以及Peer Endpoint Protocol 利用这些协议 我们可以让消息跨越多个网络 发送到网络上的任意其他Peer 这些协议是所有Java P P应用的基础 请参见图一的JXTA应用体系(该图来自) 图一 JXTA应用体系 本文的例子是一个基于JXTA的P P应用 Peer可以利用它聊天 它允许Peer把自己注册到网络上 发送消息给其他Peer 或者从其他Peer接收消息 编写JXTA应用要求JXTA内核以jxta jar JAR文件的形成存在 (jxta jar文件可以从下载 )jxta jar文件必须在CLASSPATH中 构造JXTA应用并不是一件很复杂的事情 只需实现net jxta platform Application接口 并提供该接口定义的三个方法 init() startApp()和stopApp() 下面显示的SimpleJXTA类就是一个最简单的JXTA应用(注意 程序必须导入net jxta document Advertisement类和net jxta peergroup PeerGroup接口 init()方法需要它们) // 最简单的JXTA应用 import net jxta platform Application; import net jxta document Advertisement; import net jxta peergroup PeerGroup; public class SimpleJXTA implements Application public void init(PeerGroup group Advertisement adv) public int startApp(String[] args) return ; public void stopApp() 作为一个Java应用 上面的程序是否遗漏了static void main()方法呢?其实 与普通Java应用相比 JXTA应用的运行方式有所不同 JXTA应用要求启动JXTA平台 JXTA平台启动之后 它将启动所有在jxtaConfig配置文件中指定的应用 JXTA平台启动一个应用时 首先调用应用的init()方法 接着调用startApp()方法 JXTA聊天程序 本文的聊天应用改编自JXTA Shell软件包的Talk程序 设计这个应用的主要目的是为了学习JXTA编程 它很简单 与基于Java Socket的许多聊天应用相比 它缺少许多高级特性 且不具备强健的错误控制机制 然而 这个程序用到了许多重要的JXTA类和接口 初学者可以由此开始深入了解JXTA 程序有一个很简单的GUI 如图二所示 图二 程序界面 所有来自聊天用户的消息 格式为 [用户名字] 消息 聊天程序本身报告的信息都以 > 开头 聊天程序的业务规则为 ● 用户在登录文本框中输入自己的名字 并点击 登录 按钮登录 ● 用户名字必须唯一 任何两个用户不能有相同的名字 如果某个用户输入的名字正在被其他用户使用 则应用将报告该信息 正在试图登录的用户必须改变自己的名字 ● 成功登录后 用户在消息输入框中输入消息 所有消息将以广播的形式发送给当前已经登录的所有用户 包括消息发送者本身 登录 登录的目的不是进行身份验证 任何拥有聊天程序的人都可以加入聊天 登录的目的是为了让其他用户知道当前用户的存在 使得聊天程序能够发送消息 或者从其他聊天用户接收消息 消息通过管道从一个Peer传递到另一个Peer 管道由net jxta pipe包里面的Pipe接口描述 管道是在两个JXTA应用或服务之间传递消息的核心机制 它为两个Peer之间的通信提供了简单的 单向的 异步的通道 换句话说 管道把多个Peer终端连接到了一起 接收端称为输入管道 发送端称为输出管道 要让输出管道能够把消息发送到接收管道 两个管道首先必须互相认知对方 例如 聊天应用的一个实例能够把消息发送给另一个实例之前 两个实例必须互相认知对方 应用的一个实例必须把自己 介绍给 其他实例 这是如何完成的呢? 在JXTA术语中 让其他Peer知道某个Peer已经在线叫做广告(advertising) 从技术上看 advertising意味着把一个广告发送给网络上的所有用户 这里的广告可以是任意网络资源的标识符 可以用来描述各种核心对象 例如Peer PeerGroup Service Pipe Content或Endpoint JXTA广告是与平台无关的 一般以XML文档的形式提供 在聊天程序中 由于管道是信息交换的核心对象 PipeAdvertisement代表着各个聊天用户 PipeAdvertisement描述了一个管道通信通道 管道服务利用它创建关联的输入和输出管道终端 当一个Peer发送它的广告给另一个Peer 它可以期待另一个Peer的回应 即发回它的广告 按照这种方式 双方都将拥有对方的广告 广告由应用缓冲 以便以后使用 当应用需要广播一个消息时会用到这些缓冲的广告 JXTA自动在cm子目录的特定目录下 以文件的形式(文件名字唯一)缓冲广告 对于本文的聊天应用 JXTA创建了一个名为e d b的目录 在这个目录下 有子目录Adv Groups PeerInfo Peers private public和tmp 如图三所示 所有与聊天应用联系的Peer的所有PipeAdvertisement都保存在Adv目录下 包括聊天应用自己的PipeAdvertisement educity cn/img_ / / / gif > 图三 cm目录结构 当一个用户登录 聊天应用首先检查所有本地缓冲的PipeAdvertisement 如果其中一个缓冲的PipeAdvertisement的用户名字与聊天用户输入的名字相同 则聊天应用将向用户提示名字已经被使用 这种提示可能是错误的 因为以前使用该用户名字的远程用户当时不一定登录 另外 由于聊天应用缓冲了它自己的PipeAdvertisement 用户不能在下一次会话中使用同一个名字 因此 如果必要 在启动应用之前可以清除Adv目录 当聊天应用搜索完所有本地缓冲的PipeAdvertisement 且不能找到匹配的用户名字时 它将把搜索扩展到远程用户 如果用户名字已经被某个远程用户使用 聊天应用将向试图登录的用户提示该名字不可用 至此为止 聊天应用已经可以发送消息 为了接收消息 必须启动执行监听任务的线程 sendAll()方法提取所有本地缓冲的PipeAdvertisement 以用户输入的文字为基础构造出一个消息 然后把消息发送给每一个PipeAdvertisement已经缓冲的远程用户 首先 sendAll()方法获取发送者的用户名字 接着 sendAll()方法调用getAllPipeAd()方法 获取一个包含所有本地缓冲的PipeAdvertisement的Vector 然后 sendAll()方法利用循环依次访问各个PipeAdvertisement 利用Pipe接口的createOutputPipe()方法构造一个OutputPipe对象 调用createOutputPipe()方法时传入找到的PipeAdvertisement 如下所示 // 广播广告 int length = pipes size(); for (int i = ; i<length; i++) PipeAdvertisement adv = (PipeAdvertisement) pipes get(i); OutputPipe pipeOut = null; try // 这个值仅用于测试 // 可能需要等待更长时间 pipeOut = pipe createOutputPipe(adv Pipe NonBlocking ); catch (Exception e) 如果成功地创建了OutputPipe对象 接下来开始构造Message对象 if (pipeOut != null) Message msg = null; String userInput = null; InputStream inputStream = null; try // 构造一个消息 msg = pipe createMessage(); Message对象的push()方法用来以InputStream的形式插入一组数据 因此 先把用户消息(messageBox getText())转换成一个Byte数组 再转换成ByteArrayInputStream 然后 把InputStream以参数的形式提供给push()方法 另外 我们还要在消息中加入发送者的名字 为此 先从sender字符串构造出另一个InputStream 再把它作为参数传递给push()方法 inputStream = new ByteArrayInputStream( messageBox getText() getBytes()); msg push(SENDER_TEXT inputStream); inputStream = new ByteArrayInputStream(sender getBytes()); msg push(SENDER_ID inputStream); 准备好Message对象之后 把它作为参数传递给OutputPipe类的send()方法 把消息发送给接收的Peer pipeOut send(msg); 最后 关闭OutputPipe pipeOut close(); run()方法执行与sendAll()方法相反的操作 run()方法创建一个InputPipe 监听传入的消息 提取出Message对象的用户名字和内容 并调用toDisplay()方法显示出消息 首先 run()方法利用当前Pipe对象(pipe)的createInputPipe()方法创建一个InputPipe 如果createInputPipe()方法返回null 则显示 不能打开InputPipe 错误信息 反之 如果成功地创建了InputPipe run()方法开始一个无结束条件的while循环 监听传入的消息 如下所示 // 监听传入的消息 while cha138/Article/program/Java/gj/201311/27536相关参考
如何使用JXTA技术建立P2P网络 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 作者朱传辉
把P2P进行到底:讲述Jxta的故事(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Jxt
把P2P进行到底:讲述Jxta的故事(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Jx
对等计算实践之:构建P2P应用程序框架 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 安装与执行
JXTA概念介绍(翻译) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! .JXTA定义 JXT
JXTA下的媒体数据传输 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Sun微系统公司公开了旨
知识大全 JXTA Platform JAVA参考实现源代码分析(2)
JXTAPlatformJAVA参考实现源代码分析(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
java高级编程:基于JNDI的应用开发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 基于JN
基于JSF技术的WEB应用开发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 开发基于Java技
基于Spring框架的WebSphere应用开发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!