JXTA初探

本文介绍了一个简单的JXTA网络编程实例,包括创建服务器组、管道广告及客户端发现和连接过程。通过两个核心类CreateServer和DiscoveryPeer,演示了如何搭建基本的对等网络通讯。

JXTA初探

最近学习JXTA,写了一简单程序,两个类, CreateServer和DiscoveryPeer,CreateServer先创建一个group(MagcNet)和管道广告,后利用管道广告创建JxtaServerSocket监视客消息并作处理,DiscoveryPeer发现并加入MagicNet,再利用管道广告创建JxtaSocket向Server发送数据,程序很简单,时间不多,就不详解程序了。贴出来希望对初学者有所帮助,程序如下:

//package edu.cqwu.magicqq.net.receive;

import java.util.Enumeration;
import java.io.InterruptedIOException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.Socket;

import net.jxta.peergroup.PeerGroupFactory;
import net.jxta.exception.PeerGroupException;

import net.jxta.peergroup.PeerGroup;
import net.jxta.peergroup.PeerGroupID;
import net.jxta.discovery.DiscoveryService;
import net.jxta.pipe.PipeService;
import net.jxta.protocol.PeerGroupAdvertisement;
import net.jxta.protocol.PipeAdvertisement;
import net.jxta.protocol.ModuleImplAdvertisement;
import net.jxta.document.AdvertisementFactory;
import net.jxta.id.IDFactory;
import net.jxta.socket.JxtaServerSocket;
import net.jxta.socket.JxtaSocket;


public class CreateServer{
 
 private PeerGroup netPeerGroup = null; //the NetPeerGroup
 private PeerGroup MagicNet = null; //the Magic PeerGroup
 private DiscoveryService disco = null; //discovery service
 private PipeService pipes = null; //pipe service
 private PipeAdvertisement pipeAdv = null; //pipe advertisement
 private JxtaServerSocket serverSocket = null;
 
 private int timeout = 3000;
 private String username = "Magic-idea"; //user name
 private static String groupURL = "jxta:uuid-4d6172676572696e204272756e6f202002";
 
 public CreateServer(PeerGroup parentgroup){
  //this.netPeerGroup = parentgroup;
  //this.username = "Magic-idea";
 }
 
 //Start service
 public void startServer(){
 
  try{
   joinMagicNet(); //join the MagicNet peergroup
  }catch(Exception e){
   System.out.println("Can't join or create MagicNet(local peergroup)");
   System.exit(0);
  }

  if(!createMagicPipe()){ //create the pipe
   System.out.println("ceate MagicPeer pipe failure~~");
  }
 
 
  System.out.println("starting ServerSocket");
  createServerSocket();
        while (true) {
            try {
                System.out.println("Calling accept");
                Socket socket = serverSocket.accept();
                //serverSocket.getInetAddress();
                //socket.getLocalSocketAddress();
                // set reliable
                if (socket != null) {
                    System.out.println("socket created");
                    receiveData(socket);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
 }
 
 //Discover (or create) and join the MagicNet peergroup
 private void joinMagicNet() throws Exception {
  int count = 3;   // maximun number of attempts to discover
        System.out.println("Attempting to Discover the MagicNet PeerGroup");

        // Get the discovery service from the NetPeergroup
        DiscoveryService hdisco = netPeerGroup.getDiscoveryService();

        Enumeration ae = null;  // Holds the discovered peers

        // Loop until we discover the RestoNet or
        // until we've exhausted the desired number of attempts
        while (count-- > 0) {
            try {
                // search first in the peer local cache to find
                // the MagicNet peergroup advertisement
                ae = hdisco.getLocalAdvertisements(DiscoveryService.GROUP,
                                          "Name", "MagicNet");

                // If we found the MagicNet advertisement we are done
                if ((ae != null) && ae.hasMoreElements())
                    break;

                // If we did not find it, we send a discovery request
                hdisco.getRemoteAdvertisements(null,
                       DiscoveryService.GROUP, "Name", "MagicNet", 1, null);

                // Sleep to allow time for peers to respond to the
                // discovery request
                try {
                    Thread.sleep(timeout);
                } catch (InterruptedException ie) {}
            } catch (IOException e) {
                // Found nothing! Move on.
            }
        }

        PeerGroupAdvertisement MagicNetAdv = null;

        // Check if we found the MagicNet advertisement.
        // If we didn't, then either
        //       we are the first peer to join or
        //       no other MagicNet peers are up.
        // In either case, we must create the MagicNet peergroup

        if (ae == null || !ae.hasMoreElements()) {
            System.out.println(
                 "Could not find the MagicNet peergroup; creating one");
            try {

                // Create a new, all-purpose peergroup.
                ModuleImplAdvertisement implAdv =
                    netPeerGroup.getAllPurposePeerGroupImplAdvertisement();
                MagicNet = netPeerGroup.newGroup(
                                mkGroupID(),      // Assign new group ID
                                implAdv,          // The implem. adv
                                "MagicNet",       // Name of peergroup
                                "MagicNet, Inc.");// Descrīption of peergroup

                // Get the PeerGroup Advertisement
                MagicNetAdv = netPeerGroup.getPeerGroupAdvertisement();

            } catch (Exception e) {
                System.out.println("Error in creating MagicNet Peergroup");
                throw e;
            }
        } else {
            // The MagicNet advertisement was found in the cache;
            // that means we can join the existing MagicNet peergroup

            try {
                MagicNetAdv = (PeerGroupAdvertisement) ae.nextElement();
                MagicNet = netPeerGroup.newGroup(MagicNetAdv);
                 System.out.println(
                     "Found the MagicNet Peergroup advertisement; joined existing group");
            } catch (Exception e) {
                System.out.println("Error in creating MagicNet PeerGroup from existing adv");
                throw e;
            }
        }

        try {
            // Get the discovery and pipe services for the MagicNet Peergroup
            disco = MagicNet.getDiscoveryService();
            pipes = MagicNet.getPipeService();
        } catch (Exception e) {
            System.out.println("Error getting services from MagicNet");
            throw e;
        }

        System.out.println("MagicNet MagicPeer (" + username + ") is on-line");
        return;
 }
 
 //Create and publish a MagicPeer Pipe to receive
 private boolean createMagicPipe(){
  int count = 3;           // Discovery retry count
        Enumeration ae = null;   // Discovery response enumeration

        try {
            System.out.println(
                "Attempting to Discover the MagicPipe");

            // Check if I have already published myself
            while (count-- > 0) {
                try {
                    // Check first locally if we have the advertisement cached
                    ae = disco.getLocalAdvertisements(DiscoveryService.ADV,
                                      "Name", "MagicNet:MagicPipe:" + username);

                    // If we found our pipe advertisement we are done
                    if (ae != null && ae.hasMoreElements())
                        break;

                    // We did not find the advertisement locally;
                    // send a remote request
                    disco.getRemoteAdvertisements(null,
                          DiscoveryService.ADV, "name",
                          "MagicNet:MagicPipe:" + username, 1, null);

                    // Sleep to allow time for peers to respond to the
                    // discovery request
                    try {
                        Thread.sleep(timeout);
                    } catch (InterruptedException e) {}
                } catch (IOException e) {
                    // Found nothing! Move on
                }
            }

            if (ae == null || !ae.hasMoreElements()) {
                // We did not find the pipe advertisement, so create one
                System.out.println(
                    "Could not find the MagicPeer Pipe Advertisement");

                // Create a pipe advertisement for our RestoPeer
                pipeAdv = (PipeAdvertisement)
                    AdvertisementFactory.newAdvertisement(
                        PipeAdvertisement.getAdvertisementType());

                // Assign a unique ID to the pipe
                pipeAdv.setPipeID(
                        IDFactory.newPipeID(MagicNet.getPeerGroupID() ));

                // The symbolic name of the pipe is built from
                // the brand name of MagicPeer;  each MagicPeer
                // must therefore have a unique name.
                pipeAdv.setName("MagicNet:MagicPipe:" + username);

                // Set the type of the pipe to be unidirectional
                pipeAdv.setType(PipeService.UnicastType);

                disco.publish(pipeAdv,PeerGroup.DEFAULT_LIFETIME,PeerGroup.DEFAULT_EXPIRATION);
                System.out.println(
                    "Created the Restaurant Pipe Advertisement");
            } else {
                // We found an existing pipe advertisement
                pipeAdv = (PipeAdvertisement) ae.nextElement();
                System.out.println("Found MagicPeer Pipe Advertisement");
            }

            // Create my input pipe to listen for hungry peers
            // requests
            // 创建输入管道,暂时未用
            // pipeIn = pipes.createInputPipe(myAdv);
        } catch (Exception e) {
            System.out.println("Could not initialize the MagicPeer pipe");
            return false;
        }
        return true;
 }
 
 //Create JxtaServerSocket
 private void createServerSocket(){
  try{
   serverSocket = new JxtaServerSocket(this.netPeerGroup,this.pipeAdv,10);
   serverSocket.setSoTimeout(0);
  }catch(Exception e){
   System.out.println("failure to create the JxtaServerSocket!");
   System.exit(1);
  }
 
  //using the cycle receive the data
  while (true) {
            try {
                System.out.println("Calling accept");
                Socket socket = serverSocket.accept();
                // set reliable
                if (socket != null) {
                    System.out.println("socket created");
                    receiveData(socket);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
 }
 
 //opens an output pipe to the MagicPeer requester,and receive the data
 private void receiveData(Socket socket){
  try {
         System.out.println("以下是地址:");
         System.out.println(socket.getRemoteSocketAddress());
            int size = 4096;
            byte[] buf = new byte[size];
            int read;
            InputStream in = socket.getInputStream();
            // this call should block until bits are avail.
            long total = 0;
            long start = System.currentTimeMillis();
            while (true) {
                read = in.read(buf, 0, 4096);
                if (read < 1) {
                    break;
                }
                total += read;
                //System.out.print(".");
                //System.out.flush();
            }
           
            System.out.println("哈哈~~~~"); 
            System.out.println(Byte.toString(buf[1]));

            char c[]=new char[1040];
            for(int i=0;i<520;i++){
    c[i]=(char)(buf[i*2]<<8);
    c[i]=(char)((c[i]&0xff00)|(0x00ff&buf[i*2+1]));
   }
            String s=null;
   s=new String(c);

            System.out.println("来自客户的数据: 哈哈+++ "+s.trim());
            System.out.println("");
            long elapsed = System.currentTimeMillis() - start;
            System.out.println("EOT. Received " + total + " bytes in " + elapsed + " ms. Throughput = " + ((total * 8000) / (1024 * elapsed)) + " Kbit/s.");
            socket.close();
            System.out.println("Closed connection. Ready for next connection.");
        } catch (IOException ie) {
            ie.printStackTrace();
        }
 }
 
 //create group ID
 private PeerGroupID mkGroupID() throws Exception {
        return (PeerGroupID) IDFactory.fromURL(
             new URL("urn", "", groupURL));
    }
   
    //test this class
    public static void main(String agrs[]){
    
        CreateServer cs = new CreateServer(null);
        cs.startjxta();
        cs.startServer();
       
    }
    public void startjxta(){
     try {
            //Discover and join (or start) the default peergroup
            netPeerGroup = PeerGroupFactory.newNetPeerGroup();
        } catch (PeerGroupException e) {
            //Couldn't initialize; can't continue
            System.out.println("Fatal error : creating the NetPeerGroup");
            System.exit(1);
        }
    }
}

package edu.cqwu.magicqq.net.discovery;

import java.io.IOException;
import java.io.ByteArrayInputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.net.Socket;

import net.jxta.discovery.DiscoveryService;
import net.jxta.discovery.DiscoveryListener;
import net.jxta.discovery.DiscoveryEvent;

import net.jxta.protocol.DiscoveryResponseMsg;

import net.jxta.peergroup.PeerGroup;
import net.jxta.peergroup.PeerGroupFactory;
import net.jxta.exception.PeerGroupException;
import net.jxta.protocol.PeerGroupAdvertisement;
import net.jxta.protocol.PipeAdvertisement;
import net.jxta.document.AdvertisementFactory;
import net.jxta.document.MimeMediaType;
import net.jxta.pipe.PipeService;
import net.jxta.socket.JxtaServerSocket;
import net.jxta.socket.JxtaSocket;

public class DiscoveryPeer implements DiscoveryListener{
 
 private DiscoveryService disco = null;
 private PipeService pipes = null;
 private PipeAdvertisement pipeAdv = null;
 private PeerGroup netPeerGroup = null;
 private PeerGroup MagicNet = null;
 private int timeout = 3000;
 private JxtaSocket socket = null;
 private static int ITERATIONS = 1824;
    // payload size
    private static int payloadSize = 1040;//64 * 1024;
 
 public DiscoveryPeer(PeerGroup parentgroup){
  //this.netPeerGroup = parentgroup;
 }
 
 //test
 public static void main(String agrs[]){
  DiscoveryPeer dp = new DiscoveryPeer(null);
  dp.startjxta();
  //dp.run();
 }
 //test
 public void startjxta(){
  try{
   netPeerGroup = PeerGroupFactory.newNetPeerGroup();
  }catch(PeerGroupException e){
   System.out.println("Failure to create peergroup!");
   System.exit(0);
  }
  if(!joinMagicNet()){
   System.out.println("Can't join the Magicnet!");
  }
 
  System.out.println("Find the pipeadv");
  //disco.addDiscoveryListener(this);
        //disco.getRemoteAdvertisements(null,
        //                     DiscoveryService.ADV,
        //                     "name", "MagicNet:MagicPipe:*", 5, null);                
                            
  try {
              // 为 DiscoveryResponse events 添加 DiscoveryListener
              disco.addDiscoveryListener(this);

              while (true) {
                  System.out.println("Sending a Discovery Message");
                  // 寻找Peers,每个Peer最多反馈5个 。
                  disco.getRemoteAdvertisements(null, DiscoveryService.ADV,
                                      "Name","MagicNet:MagicPipe:*",5,null);

                  // 等待一分钟
                  try {
                      Thread.sleep(2 * 1000);
                  } catch(Exception e) {}

            }
          } catch(Exception e) {
              e.printStackTrace();
          }
 }
 
 private void run(){
 
 }
 
 private boolean joinMagicNet() {

        int count = 3; // maximum number of attempts to discover

        System.out.println("Attempting to discover the MagicNet Peergroup");

        // Get the Discovery service handle from the NetPeerGroup
        DiscoveryService hdisco = netPeerGroup.getDiscoveryService();

        // All discovered RestoNet Peers
        Enumeration ae = null;

        // Loop until we find the "RestoNet" Peergroup advertisement
        // or we've exhausted the desired number of attempts
        while (count-- > 0) {
            try {
                // Check if we have the advertisement in the local
                // peer cache
                ae = hdisco.getLocalAdvertisements(DiscoveryService.GROUP,
                                            "Name", "MagicNet");

                // If we found the RestoNet advertisement, we are done
                if ((ae != null) && ae.hasMoreElements())
                    break;

                // The RestoNet advertisement is not in the local
                // cache . Send a discovery request to search for it.
                hdisco.getRemoteAdvertisements(null,
                           DiscoveryService.GROUP, "Name", "MagicNet", 1, null);

                // Wait to give peers a chance to respond
                try {
                    Thread.sleep(timeout);
                } catch (InterruptedException ie) {}
            } catch (IOException e) {
                // Found nothing! Move on.
            }
        }

        // Check if we found the RestoNet advertisement
        if (ae == null || !ae.hasMoreElements()) {
            return false;
        }

        System.out.println("Found the MagicNet PeerGroup Advertisement");
        // Get the advertisement
        PeerGroupAdvertisement adv =
            (PeerGroupAdvertisement) ae.nextElement();

        try {
            // Call the PeerGroup Factory to instantiate a new
            // peergroup instance
            MagicNet = netPeerGroup.newGroup(adv);

            // Get the Discovery and Pipe services to
            // be used within the RestoNet Peergroup
            disco = MagicNet.getDiscoveryService();
            pipes = MagicNet.getPipeService();
        } catch (Exception e) {
          System.out.println("Could not create RestoPeerGroup");
          return false;
        }

        System.out.println("The MagicPeer joined the MagicNet PeerGroup");
        return true;
    }
 
 public void discoveryEvent(DiscoveryEvent ev){
  System.out.println("Processing discovery event");
        DiscoveryResponseMsg msg = ev.getResponse();

        // The enumeration contains all the pipe advertisements that
        // were found.
        Enumeration e = msg.getResponses();
        while (e.hasMoreElements()) {
            try {
                String s = (String) e.nextElement();
                PipeAdvertisement adv = (PipeAdvertisement)
                    AdvertisementFactory.newAdvertisement(
                        new MimeMediaType("text/xml"),
                        new ByteArrayInputStream(s.getBytes()));
                //send data
                this.sendIM(adv,"哈哈~~~呵呵...测试一下哈...");
            } catch (Exception ex) {
                System.out.println("Can't connect to peer " + ex);
                continue;
            }
        }
 }
 
 public void sendIM(PipeAdvertisement pipeAdv,String str) throws IOException {

        int bufsize = 4096;

        System.out.println("Connecting to the server");
        socket = new JxtaSocket(netPeerGroup,
                                //no specific peerid
                                null,
                                pipeAdv,
                                //general TO: 30 seconds
                                30000,
                                // reliable connection
                                true);

        // Set buffer size to payload size
        socket.setOutputStreamBufferSize(65536);
        System.out.println("Reading in data");
       
        OutputStream ōut = socket.getOutputStream();
        //byte[] payload = new byte[payloadSize];
        byte[] bte = new byte[payloadSize];
        for(int i=0;i<str.length();i++){
         bte[i*2]=(byte)(str.charAt(i)>>8);
         bte[i*2+1]=(byte)str.charAt(i);
        }
        bte[str.length()+1]=(byte)(bte[str.length()+1]&0xff);
       
        long t0 = System.currentTimeMillis();
        //写出
        out.write(bte, 0, 4096);
        out.flush();
        // include close in timing since it may need to flush the
        // tail end of the stream.
        socket.close();
        long t1 = System.currentTimeMillis();
        System.out.println("Completed in :" + (t1 - t0) + " msec");
        System.out.println("Data Rate :" + ((long) 64 * ITERATIONS * 8000) / (t1 - t0) + " Kbit/sec");
    }

}

下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
垃圾实例分割数据集 一、基础信息 • 数据集名称:垃圾实例分割数据集 • 图片数量: 训练集:7,000张图片 验证集:426张图片 测试集:644张图片 • 训练集:7,000张图片 • 验证集:426张图片 • 测试集:644张图片 • 分类类别: 垃圾(Sampah) • 垃圾(Sampah) • 标注格式:YOLO格式,包含实例分割的多边形点坐标,适用于实例分割任务。 • 数据格式:图片文件 二、适用场景 • 智能垃圾检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割图像中垃圾区域的AI模型,适用于智能清洁机器人、自动垃圾桶等应用。 • 环境监控与管理:集成到监控系统中,用于实时检测公共区域的垃圾堆积,辅助环境清洁和治理决策。 • 计算机视觉研究:支持实例分割算法的研究和优化,特别是在垃圾识别领域,促进AI在环保方面的创新。 • 教育与实践:可用于高校或培训机构的AI课程,作为实例分割技术的实践数据集,帮助学生理解计算机视觉应用。 三、数据集优势 • 精确的实例分割标注:每个垃圾实例都使用详细的多边形点进行标注,确保分割边界准确,提升模型训练效果。 • 数据多样性:包含多种垃圾物品实例,覆盖不同场景,增强模型的泛化能力和鲁棒性。 • 格式兼容性强:YOLO标注格式易于与主流深度学习框架集成,如YOLO系列、PyTorch等,方便研究人员和开发者使用。 • 实际应用价值:直接针对现实世界的垃圾管理需求,为自动化环保解决方案提供可靠数据支持,具有重要的社会意义。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值