`

JXTA如何创建自定义的广告

阅读更多

广告是JXTA核心对象,它是用来公布对等机,对等机,服务,管道或者其它JXTA资源的。广告是在JXTA核心资源上提供的一个独立的平台,以供不同平台实现能够互相交流。每个广告都持有一个文件来表示。广告最典型的是XML来表示。Advertisement.getDocument(MimeMediaType)方法是用来生产广告内容的。不同陈述可以通过MIMETYPE来选择。典型的MIMETYPE"text/xml"或者"text/plain"产生正方内容为广告。广告实例是通过AdvertisementFactory工厂产生的。所有公共广告都是在net.jxta.protocol包下定义成抽象类的。对于每个抽象的公共广告在这里也有一个私有的实现用来处理文档创建和分析。这些私有实现注册在AdvertisementFactory。新创建广告类型一定要注册到AdvertisementFactory的下面,且扩展Advertisement或者ExtendableAdvertisement。下面给出的例子也是陈述如何创建一个新的广告类型,并且把新广告注册到广告工厂中。

下面我们要创建的自定义广告类是一个个人身份广告,PersonAdvertisement.java,只要我们要需要使用该广告之前把它注册到AdvertisementFactory即可。

注册代码:

AdvertisementFactory.registerAdvertisementInstance(PersonAdvertisement.getAdvertisementType(),new PersonAdvertisement.Instantiator());

下面直接贴出PersonAdvertisement.java代码:
/**
 * 创建一个个人身份广告
 * @author 牙哥
 *
 */
public class PersonAdvertisement extends Advertisement implements
  Cloneable{

 private ID id = ID.nullID;
 private String name;
 private String  sex;
 private String tel;
 private final static String NameTag = "Name";
 private final static String IDTag = "ID";
 private final static String SexTag = "Sex";
 private final static String TelTag = "Tel";
 
 //可加索引的字段,广告必须要定义可索引,为了可以在本地和network找回这些广告
 //在这里我们把ID,却相当我们身份证号码是唯一,而姓名也提供可以搜索,可是姓名不是唯一,只是为也提供也可以通过姓名搜索而已
 private final static String[] fields ={IDTag,NameTag};
 
 //默认的构造函数
 public PersonAdvertisement(){
 }
 /**
  * 通过结构文档来构造文档,即通过读一个文档而到PersonAdvertisement文档
  * @param root
  */
 public PersonAdvertisement(Element root){
        TextElement doc = (TextElement) root;
        if (!getAdvertisementType().equals(doc.getName())) {
            throw new IllegalArgumentException(
                    "Could not construct : " + getClass().getName() + "from doc containing a " + doc.getName());
        }
        initialize(doc);
 }
    /**
     * 初始化个人身份广告元素
     * @param root document root
     */
    protected void initialize(Element root) {
        if (!TextElement.class.isInstance(root)) {//只支持TextElement类型的文档
            throw new IllegalArgumentException(getClass().getName() + " only supports TextElement");//
        }
        TextElement doc = (TextElement) root;

        if (!doc.getName().equals(getAdvertisementType())) {//如果广告类型不一致,则返回异常
            throw new IllegalArgumentException(
                    "Could not construct : " + getClass().getName() + "from doc containing a " + doc.getName());
        }
        Enumeration elements = doc.getChildren();
        while (elements.hasMoreElements()) {
            TextElement element = (TextElement) elements.nextElement();
            if (!handleElement(element)) {//如果元素认证不通过,则返回异常
                throw new IllegalArgumentException("Unhandleded element \'" + element.getName() + "\' in " + doc.getName());
            }
        }
    }
    /**
     * 认证子元素是否正确过程
     */
    protected boolean handleElement(TextElement element) {
        if (element.getName().equals(IDTag)) {
            try {
                URI id = new URI(element.getTextValue());
                setID(IDFactory.fromURI(id));
            } catch (URISyntaxException badID) {
                throw new IllegalArgumentException("unknown ID format in advertisement: " + element.getTextValue());
            } catch (ClassCastException badID) {
                throw new IllegalArgumentException("Id is not a known id type: " + element.getTextValue());
            }
            return true;
        }
        if (element.getName().equals(NameTag)) {
            setName(element.getTextValue());
            return true;
        }
        if (element.getName().equals(SexTag)) {
            setSex(element.getTextValue());
            return true;
        }
        if (element.getName().equals(TelTag)) {
            setTel(element.getTextValue());
            return true;
        }
        return false;
    }
    /**
     * 返回asMimeType类型的文档
     */
    @Override
    public Document getDocument(MimeMediaType asMimeType) {
        StructuredDocument adv = StructuredDocumentFactory.newStructuredDocument(asMimeType, getAdvertisementType());
        if (adv instanceof Attributable) {
            ((Attributable) adv).addAttribute("xmlns:jxta", "http://jxta.org");//如果是继承抽象类ExtendableAdvertisement,则是减少了这部分的处理
        }
        Element e;
        e = adv.createElement(IDTag, getID().toString());
        adv.appendChild(e);
        e = adv.createElement(NameTag, getName().trim());
        adv.appendChild(e);
        e = adv.createElement(SexTag, getSex().trim());
        adv.appendChild(e);
        e = adv.createElement(TelTag, getTel().trim());
        adv.appendChild(e);
        return adv;
    }
   
    /**
     * 所有信息有一个类型标识,而该方法则标识该广告是一个PeerAdvertisement
     *
     * @return String "jxta:PersonAdvertisement"
     */
    public static String getAdvertisementType() {
        return "jxta:PersonAdvertisement";
    }
    /**
     * 每个广告必须有一个唯一的ID
     */
 @Override
 public ID getID() {
  return (id == null ? null : id);
 }

 @Override
 public String[] getIndexFields() {
  return fields;
 }
    /**
     * 实例化生产器,为了注册到AdvertisementFactory而提供
     */
    public static class Instantiator implements AdvertisementFactory.Instantiator {


        public String getAdvertisementType() {
            return PersonAdvertisement.getAdvertisementType();
        }

        public Advertisement newInstance() {
            return new PersonAdvertisement();
        }

        public Advertisement newInstance(Element root) {
            return new PersonAdvertisement(root);
        }
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof PersonAdvertisement) {
         PersonAdvertisement adv = (PersonAdvertisement) obj;

            return getID().equals(adv.getID());
        }

        return false;
    }

 

这里不支持这么长的代码,我把全部代码放在附件中,各位可以下载来看看。

3
5
分享到:
评论
6 楼 yang_jnu 2010-04-13  
恩,下载回来测试下先。。。
5 楼 lyndon.lin 2010-04-13  
下面我把全部的代码放在附件里,你可以下载全部看看。
4 楼 lyndon.lin 2010-04-13  
类型是广告类型就行了,即DiscoveryService.ADV。如果你是远程的,必须有自己的发现监听器才这样写。要不就监听器=null,就可以啦。
3 楼 lyndon.lin 2010-04-13  
原来真的不全啊,代码太长,这里支持不了。每个字段都有一个Set和Get方法的。
2 楼 yang_jnu 2010-04-13  
里面获取和设置元素的方法好像不全,例如PipeAdv.setSex("男"); 是否还要在你定义的广告类中再添加个setSex方法。。
1 楼 yang_jnu 2010-04-13  
牙哥真及时,但不知如何创建和发布出去呢?是否像下面哪样(例如张三,男,138000):
PipeAdv = (PersonAdvertisement) AdvertisementFactory.newAdvertisement(PersonAdvertisement.getAdvertisementType());
ID id = (ID) IDFactory.newID(groupID);
PipeAdv.setID(id);
PipeAdv.setName("张三");
PipeAdv.setSex("男");
PipeAdv.setTel("138000");
discoSvc.remotePublish(PipeAdv);
不知这样写对不对(感觉ID哪里怪怪的)。。

接着B点通过:
getRemoteAdvertisements(String peerid, int type, String attribute, String value, int threshold, DiscoveryListener listener)
里面的type类型是否写2?如下:
dis.getRemoteAdvertisements(null,2,"name","张三",1,this);

希望牙哥指点下。。

相关推荐

    jxta2.2 开发文档

    开发者需要了解如何创建自定义服务并将其嵌入到对等组中。 5. **管道通信**:管道是JXTA中节点间通信的主要机制,支持单向和双向数据流。理解管道的工作原理和创建、连接、发送和接收数据的方法是必要的。 6. **...

    jxta-java p2p网络编程技术

    1. **JXTA API**:熟悉JXTA提供的API,包括对等组、广告、管道、服务等的创建和管理,以及如何使用这些API进行P2P应用的开发。 2. **网络发现**:理解如何使用JXTA的发现服务来查找网络中的其他节点、资源和服务。 ...

    JXTA技术手册源代码.

    - **ch06**:可能讲解服务的实现,如何定义自定义服务并使其在JXTA网络中可用。 - **ch07**:可能涉及更高级的主题,如安全性和网络管理,或者特定的P2P应用场景。 通过深入研究这些源代码,开发者可以了解JXTA的...

    基于JXTA的CMS内容共享

    实现基于JXTA的CMS内容共享,关键步骤包括创建对等组(Peer Group)、共享目录、以及检索JXTA相关内容。通过对等组的建立,Peer能够加入并与其他成员进行通信;共享目录的设置则允许Peer上传和分享文件;而内容的...

    jxta-src-2.4.1.tar.gz_jxta

    5. **服务(Services)**: JXTA提供多种内置服务,如发现服务、身份服务、管道服务等,开发者也可以创建自定义服务。 6. **协议栈(Protocol Stack)**: JXTA的协议栈由一系列模块组成,包括对等发现、管道管理、...

    jxta-src-2.3.5.zip_java p2p_jxta_jxta 2.5

    6. **服务(Service)**:JXTA定义了一系列标准服务,如身份认证、消息交换、文件共享等,开发者可以通过接口扩展自定义服务。 7. **协议栈(Protocol Stack)**:JXTA协议栈包括身份、发现、管道、消息、交换等...

    jxta-myjxta-src-2.5.zip_2.5 myjxta_jxta 2.5_jxta-myjxta-2.5.zip_

    通过阅读源码,我们可以学习如何创建和实现自定义的JXTA服务。 7. **事件处理与回调**:JXTA框架基于事件驱动,myjxta源码中包含了大量的事件监听器和回调函数,这对于理解和实现异步编程模型至关重要。 8. **网络...

    jxta-shell-src-2.3.4.rar_JXTA Shell 2.5_r_java shell_jxta_jxta s

    在JXTA Shell中,每个命令都是一个独立的Java类,实现了特定的功能,例如`PeerGroupCommand`用于处理与P2P群组相关的操作,`AdvQueryCommand`则处理广告查询等。通过阅读这些命令的源码,开发者可以了解如何与JXTA...

    JXSE JXTA pdf

    1. **JXTA协议栈**:JXTA协议栈由一系列协议组成,如Rendevous服务、管道、广告和发现,这些协议构成了P2P网络的基础。 2. **JXSE架构**:介绍JXSE的核心组件,如JXSE运行时环境、PEER、边缘服务和核心API,以及...

    JXTA——Java P2P网络编程技术

    - **第五章**:可能涵盖JXTA中的服务和广告机制,如何发布和查找资源,以及如何实现自定义服务。 学习JXTA可以帮助开发者理解P2P网络的原理,并利用Java实现高效、灵活的分布式应用。通过实践和深入阅读这些章节,...

    JXTA P2P编程技术例程

    每个例程可能涵盖不同的主题,例如设置基本的P2P连接、实现数据交换、创建自定义服务等。 通过深入学习这些例程,开发者可以掌握JXTA的核心概念,并具备实际开发P2P应用的能力。这四个文档将逐步展示JXTA的使用方法...

    JXTA开发包2

    另一方面,"jxme-2.1.3-src.zip"包含了源代码,这对于那些希望深入理解JXTA工作原理或者想要自定义JXTA组件的开发者来说是极其宝贵的。源代码可以让开发者查看并调试底层实现,进行定制化开发,或者在遇到问题时进行...

    javap2p基于jxta

    通过“myjxtademo”这个示例,我们可以看到如何初始化JXTA环境,创建边缘服务,建立管道,发布和发现广告,以及发送和接收消息。这将帮助我们理解P2P网络中节点如何相互发现、交换数据和协同工作。此外,还可以学习...

    JXTA-Java-P2P网络编程技术书后源码

    - **广告的创建与管理**:展示如何定义和发布自定义服务广告,以及如何查询和响应其他对等体的广告。 - **管道的建立与通信**:包括建立点对点或多点对多点的通信管道,以及通过管道传输不同类型的数据。 - **安全性...

    JXTA-Java P2P网络编程技术.pdf

    1. **广告(Advertisements)**:这是JXTA的核心概念,广告是一种结构化的数据格式,用于描述节点上的资源、服务或身份。它们通过发布和查询机制进行交换,使得节点能够发现网络中的其他节点和资源。 2. **边缘...

    lib-dependencies-2.7.zip

    开发过程中,可以利用JXTA的API来创建自定义的P2P应用,如文件共享、分布式计算或者协同工作平台。 在实际开发中,理解并掌握JXTA的关键概念和技术至关重要。例如,理解边缘节点如何通过广告和查询机制来发现和交互...

    jxse-shell-2.5.rar

    3. **服务部署**:安装和管理JXTA提供的各种服务,如发布/检索服务、管道服务、广告服务等。这些服务构成了P2P网络的核心功能。 4. **资源发布与检索**:发布本地资源到网络,让其他节点可以检索。同时,也可以从...

Global site tag (gtag.js) - Google Analytics