`

自己写的JXTA CMS例子

 
阅读更多
注意:下面两个例子要放在不同工程中。



分享端:

[java] view plaincopy

    package com.yangsure.cms; 
     
    import java.io.File; 
    import java.util.logging.Level; 
    import java.util.logging.Logger; 
     
    import net.jxta.peergroup.*; 
    import net.jxta.share.*; 
     
    public class SimpleShare { 
        public SimpleShare() { 
        } 
     
        private PeerGroup netPeerGroup = null; 
        private CMS cms = null; 
     
        public static void main(String args[]) { 
            SimpleShare myShare = new SimpleShare(); 
            myShare.startCMS(); 
     
        } 
     
        public void startCMS() { 
            try { 
                Logger.getLogger("net.jxta").setLevel(Level.SEVERE); 
                System.out.println("start   CMS...... "); 
                netPeerGroup = PeerGroupFactory.newNetPeerGroup(); 
                cms = new CMS(); 
                cms.init(netPeerGroup, null, netPeerGroup 
                        .getPeerGroupAdvertisement()); 
                String homedir = "SimpleShare"; 
                if (cms.startApp(new File(homedir)) == -1) { 
                    System.out.println("CMS   initialization   failed "); 
                    System.exit(-1); 
                } 
                releaseShareFiles(new File("./src/java.txt")); 
                while (true) { 
                    Thread.sleep(5000); 
                } 
            } catch (Exception e) { 
                System.out.println(e.getMessage()); 
                System.exit(-1); 
            } 
        } 
     
        public void releaseShareFiles(File f) { 
            try { 
                cms.getContentManager().share(f); 
                System.out.println("share   files "); 
            } catch (Exception e) { 
                System.out.println(e.getMessage()); 
            } 
        } 
    } 



搜索下载端:

[java] view plaincopy

    package com.yangsure.cms; 
    import java.io.File; 
    import java.util.logging.Level; 
    import java.util.logging.Logger; 
     
    import net.jxta.peergroup.*; 
    import net.jxta.share.*; 
    import net.jxta.share.client.*; 
     
    public class SimpleSearch { 
     
        private PeerGroup netPeerGroup = null; 
        private ListContentRequest request = null; 
        private String searchString = null; 
     
        public SimpleSearch(String subStr) { 
            searchString = subStr; 
        } 
     
        public static void main(String args[]) { 
            SimpleSearch mySearch = new SimpleSearch("java.txt"); 
            mySearch.run(); 
        } 
     
        public void run() { 
            try { 
                Logger.getLogger("net.jxta").setLevel(Level.SEVERE); 
                netPeerGroup = PeerGroupFactory.newNetPeerGroup(); 
                while (true) { 
                    request = new MyListRequest(netPeerGroup, searchString); 
                    request.activateRequest(); 
                    System.out.println("have   result"); 
                    Thread.sleep(5000); 
                    request.cancel(); 
                } 
            } catch (Exception e) { 
                System.out.println(e.getMessage()); 
                System.exit(-1); 
            } 
        } 
     
        class MyGetRequest extends GetContentRequest { 
     
            public MyGetRequest(PeerGroup group, ContentAdvertisement adv, 
                    File inFile) { 
                super(group, adv, inFile); 
            } 
     
            public MyGetRequest(PeerGroup group, ContentAdvertisement[] adv, 
                    File inFile) { 
                super(group, adv, inFile); 
            } 
     
        } 
     
        class MyListRequest extends CachedListContentRequest { 
            private PeerGroup group; 
     
            public MyListRequest(PeerGroup group, String subString) { 
                super(group, subString); 
                this.group = group; 
            } 
     
            public void notifyMoreResults() { 
                System.out.println("come "); 
                ContentAdvertisement[] res = getResults(); 
                for (int i = 0; i < res.length; i++) { 
                    System.out.println(res[i].getName()); 
                    MyGetRequest m = new MyGetRequest(group, res[i], new File( 
                            "c:/java.txt")); 
                    m.run(); 
                } 
            } 
        } 
     
    } 



下需要下载jxta依赖的包以及jxtacms.jar


JXTA的一个例子

这是一个简单的应用JXTA的客户/服务器结构的例子,服务器端创建监听线程,客户端主动连接一次。所有代码非常简洁的说明了JXTA的C/S应用的设计框架,原例子是在http://www.jxta.org/Tutorials.html,我在本机和局域网内已调试通过,并加了注释,有兴趣的朋友看看吧。
需要引用的jar包有三个:jxta.jar,log4j.jar,bcprov-jdk14.jar
服务器端


package com.solo.server;

import java.io.*;

import net.jxta.discovery.*;
import net.jxta.document.*;
import net.jxta.endpoint.*;
import net.jxta.exception.*;
import net.jxta.id.*;
import net.jxta.peergroup.*;
import net.jxta.pipe.*;
import net.jxta.platform.*;
import net.jxta.protocol.*;

public class SoloServer {

  static PeerGroup group = null;
  static PeerGroupAdvertisement groupAdvertisement = null;
  private DiscoveryService discovery;
  private PipeService pipes;
  private InputPipe myPipe; // 输入管道,从客户端来的
  private Message msg;  // 收到的消息
  private ID gid;

  public static void main(String[] args) {
    SoloServer myServer = new SoloServer();
    System.out.println("Starting service peer...");
    System.out.println(System.getProperty("user.dir"));
    myServer.startJxta();
    System.out.println("Good Bye ....");
    System.exit(0);
  }

  private void startJxta() {
    try {
      // 开始,要使用默认的JXTA组
      group = PeerGroupFactory.newNetPeerGroup();
    }
    catch (PeerGroupException ex) {
      System.out.println("fatal error : group creation failure");
      ex.printStackTrace();
      System.exit(1);
    }
    // 得到默认组的通告
    groupAdvertisement = group.getPeerGroupAdvertisement();
    // 获取该通告的发现服务
    System.out.println("Getting DiscoveryService...");
    discovery = group.getDiscoveryService();
    // 获取该通告的管道服务
    System.out.println("Getting PipeService...");
    pipes = group.getPipeService();

    startServer();
  }

  private void startServer() {
    System.out.println("Start the Server daemon...");

    // 读该组的ID
    gid = group.getPeerGroupID();

    try {
      // 创建一个模块化的简单的通告,此通告仅仅用来表示该服务的存在。
      // 如果端点要访问该服务,还得创建一个指定的通告,来关联服务。
      ModuleClassAdvertisement mcadv = (ModuleClassAdvertisement)
          AdvertisementFactory.newAdvertisement(ModuleClassAdvertisement.
                                                getAdvertisementType());
      mcadv.setName("JXTAMOD:JXTA-SOLO-XDS-CN");
      mcadv.setDescription("SOLO SERVER FOR SOLO-CN WITH JXTA FRAMEWORK.");

      ModuleClassID mcID = IDFactory.newModuleClassID();
      mcadv.setModuleClassID(mcID);

      discovery.publish(mcadv);
      discovery.remotePublish(mcadv);

      // 创建一个指定的通告,使得端点可以与服务相连。
      // 该通告包含端点连接服务所需要的所有信息,
      // 例如它包含一个端点用来与服务关联的输入管道数据
      ModuleSpecAdvertisement mdadv = (ModuleSpecAdvertisement)
          AdvertisementFactory.newAdvertisement(ModuleSpecAdvertisement.
                                                getAdvertisementType());
      // 填充相关的信息
      mdadv.setName("JXTASPEC:JXTA-SOLO-XDS-CN");
      mdadv.setVersion("VERISON 1.0");
      mdadv.setCreator("solo.com");
      mdadv.setModuleSpecID(IDFactory.newModuleSpecID(mcID));
      mdadv.setSpecURI("http://www.solo_xds.cn");

      // 创建输入管道,端点必须使用同样的管道才能与服务通话,
      // 当端点发现服务通告时,提取此管道数据来创建它的输出管道,
      // 我们采用从文件中读取该管道信息的原因是为了保证每次创建的都是相同的管道。
      System.out.println("Reading in PipeService.adv....");
      PipeAdvertisement pipeadv = null;
      try {
        FileInputStream is = new FileInputStream("pipeserver.adv");
        XMLDocument document = (XMLDocument) StructuredDocumentFactory.
            newStructuredDocument(MimeMediaType.XMLUTF8, is);
        pipeadv = (PipeAdvertisement)
            AdvertisementFactory.newAdvertisement(
                document);
        is.close();
      }
      catch (Exception e) {
        System.out.println("failed to read/parse pipe advertisement");
        e.printStackTrace();
        System.exit( -1);
      }
      // 将此管道的通告保存在指定的服务通告中,
      // 每次端点与服务联系时都可得到此通告。
      mdadv.setPipeAdvertisement(pipeadv);

      // 显示一下服务通告
      StructuredTextDocument doc = (StructuredTextDocument)
          mdadv.getDocument(MimeMediaType.XMLUTF8);
      StringWriter out = new StringWriter();
      doc.sendToWriter(out);
      System.out.println(out.toString());
      out.close();

      // 好了,通告已经建立,发布到本地缓存和默认组的缓存中。
      discovery.publish(mdadv);
      discovery.remotePublish(mdadv);

      //开始服务了,准备好输入管道吧。
      myPipe = pipes.createInputPipe(pipeadv);
    }
    catch (Exception ex) {
      ex.printStackTrace();
      System.out.println("Server: Error publishing the module");
    }

    // listen死循环,不能停止
    while (true) {
      System.out.println("Waiting for client messages to arrive...");
      try {
        // listen pipe
        msg = myPipe.waitForMessage();
      }
      catch (Exception e) {
        myPipe.close();
        System.out.println("Server: Error listening for message");
        return;
      }

      String ip = null;
      // 读取端点传来的信息
      try {
        Message.ElementIterator en = msg.getMessageElements();
        if (!en.hasNext()) {
          return;
        }
        MessageElement msgElement = msg.getMessageElement(null, "DataTag");
        if (msgElement.toString() != null) {
          ip = msgElement.toString();
        }
        if (ip != null) {
          // 显示吧
          System.out.println("Server: receive message: " + ip);
        }
        else {
          System.out.println("Server: error could not find the tag");
        }
      }
      catch (Exception ex) {
        System.out.println("Server: error receiving message");
      }
    }
  }
}



客户端


package com.solo.client;

import java.io.*;
import java.util.*;

import net.jxta.discovery.*;
import net.jxta.document.*;
import net.jxta.endpoint.*;
import net.jxta.exception.*;
import net.jxta.peergroup.*;
import net.jxta.pipe.*;
import net.jxta.protocol.*;

public class SoloClient {
  static PeerGroup netPeerGroup = null;
  static PeerGroupAdvertisement groupAdvertisement = null;
  private DiscoveryService discovery;
  private PipeService pipes;
  private OutputPipe myPipe; // 输出管道,到服务的
  private Message msg;

  public SoloClient() {
  }

  public static void main(String[] args) {
    SoloClient myClient = new SoloClient();
    System.out.println("Starting Client peer ....");
    myClient.startJxta();
    System.out.println("Good Bye ....");
    System.exit(0);
  }

  /**
   * startJxta
   */
  private void startJxta() {
    try {
      // 创建默认的JXTA组。
      netPeerGroup = PeerGroupFactory.newNetPeerGroup();
    }
    catch (PeerGroupException e) {
      System.out.println("fatal error : group creation failure");
      e.printStackTrace();
      System.exit(1);
    }

    // 获取该组通告
    groupAdvertisement = netPeerGroup.getPeerGroupAdvertisement();
    // 获取该组发现服务
    System.out.println("Getting DiscoveryService");
    discovery = netPeerGroup.getDiscoveryService();
    // 获取该组管道服务
    System.out.println("Getting PipeService");
    pipes = netPeerGroup.getPipeService();
    startClient();

  }

  private void startClient() {

    System.out.println("Start the Client");

    // 找到服务
    System.out.println("searching for the JXTA-SOLO-XDS-CN Service advertisement");
    Enumeration en = null;
    while (true) {
      try {

        // 在本地的缓存中查找服务(JXTA-SOLO-XDS-CN)
        en = discovery.getLocalAdvertisements(DiscoveryService.ADV
                                              , "Name"
                                              , "JXTASPEC:JXTA-SOLO-XDS-CN");

        // 找到就好
        if ( (en != null) && en.hasMoreElements()) {
          break;
        }

        // 本地没有,只好根据服务名称远程搜索
        discovery.getRemoteAdvertisements(null
                                          , DiscoveryService.ADV
                                          , "Name"
                                          , "JXTASPEC:JXTA-SOLO-XDS-CN", 1, null);

        // 发现过程是异步的,我们不知道需要多长时间
        try {
          Thread.sleep(2000);
        }
        catch (Exception e) {}

      }
      catch (IOException e) {
        // 啥也没找到,继续
      }
      //显示点吧
      System.out.print(".");
    }

    System.out.println("we found the service advertisement");

    // 找到以后,得到特殊服务的通告
    ModuleSpecAdvertisement mdsadv = (ModuleSpecAdvertisement) en.nextElement();
    try {

      // 显示一下通告而已
      StructuredTextDocument doc = (StructuredTextDocument)
          mdsadv.getDocument(MimeMediaType.TEXT_DEFAULTENCODING);

      StringWriter out = new StringWriter();
      doc.sendToWriter(out);
      System.out.println(out.toString());
      out.close();

      // 根据获取的通告,获取管道
      PipeAdvertisement pipeadv = mdsadv.getPipeAdvertisement();

      // 用上面的通道,通知服务创建输出通道了,试着创建3次。
      for (int i = 0; i < 3; i++) {
        myPipe = pipes.createOutputPipe(pipeadv, 10000);
      }

      // 要说的话
      String data = "我靠,成功啦!!!";

      // 组织成消息
      msg = new Message();
      StringMessageElement sme = new StringMessageElement("DataTag", data, null);
      msg.addMessageElement(null, sme);

      // 通过管道发送吧
      myPipe.send(msg);
      System.out.println("message \"" + data + "\" sent to the Server");
    }
    catch (Exception ex) {
      ex.printStackTrace();
      System.out.println("Client: Error sending message to the service");
    }
  }

}


==========================================
在服务器端的根目录下还需要一个叫作pipeserver.adv的管道通告文件,这个文件的作用是使得每次服务启动时创建的都是同一个管道服务。


<?xml version="1.0"?>

<!DOCTYPE jxta:PipeAdvertisement>

<jxta:PipeAdvertisement xmlns:jxta="http://jxta.org">
&<60;&<60;<Id>
&<60;&<60;&<60;&<60;urn:jxta:uuid-9CCCDF5AD8154D3D87A391210404E59BE4B888209A2241A4A162A10916074A9504
&<60;&<60;</Id>
&<60;&<60;<Type>JxtaUnicast</Type>
&<60;&<60;<Name>JXTA-SOLO-XDS-CN</Name>
</jxta:PipeAdvertisement>


第一次启动服务器和客户端时需要输入节点名和密码,随便输入就可以了。


分享到:
评论

相关推荐

    jxta-cms-src-2.4.1.zip_jxta cms

    标题 "jxta-cms-src-2.4.1.zip_jxta cms" 暗示了我们正在讨论的是一个与JXTA(Java eXtensible Networking Platform)相关的CMS(Content Management System)源代码包,版本为2.4.1。JXTA是一个开放源代码的P2P...

    jxta.rar_jxta_jxta cms

    总结来说,"jxta.rar_jxta_jxta cms"这个压缩包中的三个关键组件——"jxta.jar"、"cms.jar"和"jdom.jar",为构建基于JXTA的P2P系统提供了必要的工具和库。它们共同构建了一个强大且安全的P2P环境,使得开发者能够...

    JXTA CMS搜索技术的研究

    JXTA CMS搜索技术的研究JXTA CMS搜索技术的研究JXTA CMS搜索技术的研究JXTA CMS搜索技术的研究

    jxta-cms-src-2.3.7.rar_cms java_cms jxta_cms r_jxta_jxta c++

    《CMS与JXTA技术深度探索:初学者的实践指南》 在当今信息化时代,内容管理系统(CMS)和对等网络技术(JXTA)在软件开发领域扮演着至关重要的角色。"jxta-cms-src-2.3.7.rar"这个压缩包文件为我们提供了一个独特的...

    基于JXTA的CMS内容共享

    ### 基于JXTA的CMS内容共享深入解析 #### 引言 在现代互联网技术的迅猛发展中,P2P(点对点)计算模式作为一种非集中化的网络架构,正逐渐解决传统集中式网络模式中存在的诸多问题,如单点故障、信息存储不合理...

    jxta-cms-src-2.4.zip_cms_cms java_cms jxta_java cms_jsp cms mysq

    jxta-cms-src-2.4.zip 是官网上的比较稳定的CMS源代码。目前是最稳定的高版本。

    jxta-myjxta-2.5.zip_file sharing in chat_jxta 2.5 例子_jxta2.5.jar

    综上所述,"jxta-myjxta-2.5.zip"提供了一个学习和实践JXTA技术的良好平台,涵盖了P2P网络的核心功能,并通过"file_sharing_in_chat"和"jxta_2.5_例子"标签强调了文件共享和聊天服务的实现。开发者可以通过这个实例...

    精通JXTA 。JXTAShell

    了解这些基础知识是掌握JXTA的前提,有助于开发者构建自己的P2P系统时选择合适的架构和策略。 其次,JXTAShell作为JXTA的重要工具,是一个用于管理、配置和调试JXTA网络的命令行接口。书中将详细阐述如何使用JXTA...

    JXTA JXTA.jar

    jxta.jar p2p jxta.jar p2p jxta.jar p2p

    jxta例程

    压缩包中的"jxta例程"很可能包含了以上这些功能的代码实例,每个例子都有详细的注释和说明,帮助开发者逐步学习和实践JXTA编程。通过这些例程,你可以理解JXTA的架构,学习如何建立P2P网络,编写服务发布和发现的...

    jxta2.2 开发文档

    10. **内容管理系统**:“jxtacms_doc.zip”可能涵盖了JXTA Content Management System(CMS)的使用,这是一个用于存储、检索和分发内容的系统,适用于P2P环境中的文件共享。 通过深入学习和实践这些文档,开发者...

    jxta messager

    **JXTA (Java Xtreme Protocol) 消息器** JXTA 是一个开放源代码的P2P(对等网络)平台,由Sun Microsystems在2001年推出...通过研究和实践,你可以掌握如何构建自己的P2P应用程序,从而在未来的项目中应用这些技术。

    精通JXTA --本书是一本介绍JXTA的书籍

    **精通JXTA:探索P2P技术的深度** JXTA(Java Xtreme Programming eXchange)是一种基于Java的开放源代码平台,用于构建对等网络(P2P)应用。它允许设备之间直接通信,共享资源和服务,无需中心服务器。这本书...

    jxta2.7.zip

    JXTA(Java eXtensible Peer-to-Peer Technology Platform)是Oracle公司开发的一个开源、跨平台的P2P(Peer-to-Peer)框架,它为构建基于对等网络的应用程序提供了一组标准协议和API。JXTA 2.7是这个框架的一个版本...

    jxta运行的所有jar包

    jxta运行环境所需要的所有jar包 /files/JXTA_Demo/lib/jxta.jar /files/JXTA_Demo/lib/beepcore.jar /files/JXTA_Demo/lib/cryptix-asn1.jar /files/JXTA_Demo/lib/cryptix32.jar /files/JXTA_Demo/lib/jxtaptls.jar...

    jxta-shell-2.4.zip

    2. **配置管理**:用户可以通过Shell来配置自己的JXTA节点,设置身份、发布和发现服务、管理管道等。 3. **服务操作**:JXTA Shell支持发布、查找、取消发布和使用各种JXTA服务,如文件共享、消息传递和协同工作。 ...

    JXTA开发包1

    **JXTA 开发包1** 是一组专为开发P2P(对等网络)应用程序设计的组件。这个开发包源自官方站点 **jxta.org** ,并经过了安全检查,确保无病毒,为开发者提供了安全可靠的开发环境。P2P技术是一种分布式计算模型,...

    jxta2.0协议_CN

    《深入解析JXTA 2.0协议:构建去中心化的网络通信》 JXTA 2.0协议,作为一项先进的分布式计算技术标准,旨在为互联网应用提供一种全新的、去中心化的网络通信机制。其核心价值在于允许任何设备在网络中以对等的方式...

    JXTA.rar_beepcore java_jxta_jxta jar_jxta xchat_p2psocket jxta

    这个例子可以帮助初学者理解JXTA的核心概念,如对等节点的交互、服务发现和数据交换。 **P2PSocket_JXTA**则是JXTA中的一种特殊类型的套接字,它扩展了传统的Java Socket API,使它们能够工作在P2P环境中。P2...

Global site tag (gtag.js) - Google Analytics