📄 network.java
字号:
/**
* @(#)RiverCrescent.java
*
* JFC Sample application
*
* @author Sinpool
* @version 1.00 05/02/22
*/
package com.sinpool.rivercrescent;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import net.jxta.peergroup.*;
import net.jxta.exception.*;
import net.jxta.document.*;
import net.jxta.discovery.*;
import net.jxta.id.*;
import net.jxta.pipe.*;
import net.jxta.protocol.*;
import net.jxta.endpoint.*;
import com.sinpool.rivercrescent.Listener.*;
import com.sinpool.rivercrescent.BufferZone.JoinedPeerGroups;
import com.sinpool.rivercrescent.myutil.MyUtil;
public class NetWork{
private PeerGroup netpg = null; // The NetPeerGroup
private PeerGroup riverCrescentNet = null; // The RiverCrescentNet Peergroup
//RiverCrescentNet组的服务
private DiscoveryService disco = null; // 发现服务
private PipeService pipes = null; // 管道服务
private PipeAdvertisement myAdv = null; // 管道通告
private InputPipe pipeIn = null; // 用于监听的输入管道
private int timeout = 3000; // 发现请求等待的延时
//用于创建一个独一无二的组
private static String groupURL = "jxta:uuid-B878EEF13B9C4D62B47A84D96890326402";
private Vector tableList = new Vector();
private JoinedPeerGroups joinedPeerGroups = new JoinedPeerGroups(5);
private JLabel statusLabel;
private JList searchList;
public NetWork(JLabel statusLabel){
this.statusLabel = statusLabel;
}
/**初始化一个NetWork对象,<br>
*为了开始工作做好准备,<br>
*没有任何参数,<br>
*初始化后,客户端已经进入了:<br>
*RiverCrescentNet组<br>
*等待下一步工作,<br>
*一般是"获得现有的共享文件列表"。<br>
*/
public void init(){
try {
//发现并加入默认的组(NetPeerGroup)
netpg = PeerGroupFactory.newNetPeerGroup();
} catch (PeerGroupException e) {
//不能初始化,不能继续时
statusLabel.setText("状态:Fatal error : creating the NetPeerGroup");
System.exit(1);
}
// 发现(创建)并加入 RiverCrescentNet peergroup
try {
joinRiverCrescentNet();
} catch (Exception e) {
statusLabel.setText("不能加入或创建 RiverCrescentNet 组");
System.exit(1);
}
}
private void joinRiverCrescentNet() throws Exception {
int count = 3; // 尝试发现组的次数
statusLabel.setText("状态:正在尝试发现 RiverCrescentNet PeerGroup");
// 获得NetPeergroup组的发现服务
DiscoveryService hdisco = netpg.getDiscoveryService();
Enumeration ae = null; // 保存发现的PeerGroups
while (count-- > 0) {
try {
//首先在本地缓存搜索组通告
ae = hdisco.getLocalAdvertisements(DiscoveryService.GROUP,
"Name", "RiverCrescentNet");
// 如果发现了RiverCrescentNet组通告,就停止搜索
if ((ae != null) && ae.hasMoreElements())
break;
// 如果班本地没有此通告,向网络发送发现请求
hdisco.getRemoteAdvertisements(null,
DiscoveryService.GROUP, "Name", "RiverCrescentNet", 1, null);
//等待其他Peer返回响应
try {
Thread.sleep(timeout);
} catch (InterruptedException ie) {}
} catch (IOException e){
// 没有发现是的异常,跳过此处,执行下面的内容
}
}
PeerGroupAdvertisement riverCrescentNetAdv = null;
//根据组通告获得与否,
//来加入组
//或新建一个组
if (ae == null || !ae.hasMoreElements()) {
statusLabel.setText(
"没有发现 RiverCrescentNet peergroup; 马上创建一个……");
try {
// 用"一般性的模块实现通告"创建一个新组
ModuleImplAdvertisement implAdv =
netpg.getAllPurposePeerGroupImplAdvertisement();
riverCrescentNet = netpg.newGroup(
mkGroupID(), // 生成新的组ID
implAdv, // 实现通告
"RiverCrescentNet", // 组名称
"一个文件共享组"); // 组描述
// 获得PeerGroup组通告
riverCrescentNetAdv = netpg.getPeerGroupAdvertisement();
} catch (Exception e) {
statusLabel.setText("状态:创建 RiverCrescentNet Peergroup 时失败!");
throw e;
}
} else {
//如果前面在本地发现了该组,就加入它
try {
riverCrescentNetAdv = (PeerGroupAdvertisement) ae.nextElement();
riverCrescentNet = netpg.newGroup(riverCrescentNetAdv);
statusLabel.setText(
"Found the RiverCrescentNet Peergroup advertisement");
} catch (Exception e) {
statusLabel.setText("状态:通过存在的通告创建 RiverCrescentNet PeerGroup 失败!");
throw e;
}
}
try {
//获得riverCrescentNet组的发现和管道服务
disco = riverCrescentNet.getDiscoveryService();
pipes = riverCrescentNet.getPipeService();
} catch (Exception e) {
statusLabel.setText("状态:过的 RiverCrescentNet 组服务时出现错误!");
throw e;
}
statusLabel.setText("状态:RiverCrescentNet 组已经加入!");
return;
}
private PeerGroupID mkGroupID() throws Exception {
return (PeerGroupID) IDFactory.fromURL(
new URL("urn", "", groupURL));
}
public void findTable(String Attrib,String value,int threshold,JList l){
this.searchList = l;//用于显示搜索到的组,是一个组件。
// int count = 3; // 尝试发现组的次数
statusLabel.setText("状态:尝试发现共享文件的组……");
// 获得 riverCrescentNet 组的发现服务
DiscoveryService hdisco = riverCrescentNet.getDiscoveryService();
Enumeration ae = null; // 保存发现的PeerGroups
FindTableListener ftl = new FindTableListener(tableList,this);
hdisco.addDiscoveryListener(ftl);
hdisco.getRemoteAdvertisements(null,
DiscoveryService.GROUP, Attrib, value, threshold, null);
}
////////////////////////////////以后要改造成画画的方法
public void printTables(){
searchList.removeAll();
int size = tableList.size();
String[] s = new String[size];
for (int i=0; i<size; i++){
s[i] = "NO." + (i) + "组(组名): " + ((PeerGroupAdvertisement)tableList.get(i)).getName();
}
searchList.setListData(s);
}
/**这个方法用于加入查询来的组,<br>
*查询来的组被放在一个"列表"组件中,<br>
*
*@param index 是列表中的索引值,<br>
* 即,是哪一个组。<br>
*@param name 是用户在组中使用的名字或标示。<br>
*
*@return 一个String对象,组ID<br>
* 如果创建新组时失败,返回null。<br>
*
*此方法内嵌一个Hashtable:
* 第一个元素是动作类型;<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -