- 浏览: 234746 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
annyliyear:
找到的ExtJS实现多选下拉框3个代码 -
yinboxian:
源码太乱了
JXTA中使用JxtaServerPipe和JxtaBiDiPipe实现双向可靠的通信 -
yinboxian:
我的peers第一次执行时可以得到正确的结果,以后就不行了。不 ...
JXTA中基于管道监听方式通信 -
cuizhenfu#gmail.com:
http://www.cnblogs.com/cuizhf
JXTA中使用JxtaServerPipe和JxtaBiDiPipe实现双向可靠的通信 -
luxing44530:
请问, jsp页面如果在 META-INF 中, 改怎么访问? ...
Servlet3.0 新特性之模块化实践
本文主要讲解的是如何单纯发布管道广告,及利用发现的管道进行简单的信息通信。PeerServer发布管道广告,等待其它PeerClient发现及连接,然后向PeerServer发送一条内容为“你是谁”的信息。下面给出的两个类可以放在同个目录下运行。
public class PeerServer {
private DiscoveryService discoveryService = null;
private PipeService pipeService = null;
private PeerGroup restoNet = null;
private PeerGroupID peerGroupID = null;
private InputPipe inputPipe = null;
public static void main(String[] args) {
Logger.getLogger("net.jxta").setLevel(Level.SEVERE);
PeerServer peer1 = new PeerServer();
peer1.launchJXTA();
}
private void launchJXTA() {
try {
NetworkConfigurator config = new NetworkConfigurator();//设置配置可以跳过第1次运行时出现的配置UI
config.setPrincipal("peer1");// Peer名称
config.setPassword("888888888");// Peer密码
config.save();
restoNet = new NetPeerGroupFactory().getInterface();
peerGroupID = restoNet.getPeerGroupID();
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
discoveryService = restoNet.getDiscoveryService();// 取得NetPeerGroup的发现服务
pipeService = restoNet.getPipeService();// 取得NetPeerGroup的管道服务
startServer();// 开始启动
}
private void startServer() {
publishPipeAdvertisement();// 发布管道广告
}
//创建及发布管道广告
private void publishPipeAdvertisement() {
PipeAdvertisement pipeAdv = createPipeAdvertisement();
// -----------------以下这段代码只是为了把管道广告的内容打印出来--------------------------
StructuredTextDocument doc = (StructuredTextDocument) pipeAdv
.getDocument(MimeMediaType.XMLUTF8);
StringWriter out = new StringWriter();
try {
doc.sendToWriter(out);
System.out.println(out.toString());
out.close();
} catch (IOException e) {
e.printStackTrace();
}
// -----------------------------打印结束--------------------------------------------
try {
discoveryService.publish(pipeAdv);//本地发布管道广告
discoveryService.remotePublish(pipeAdv);//远程发布管道广告
inputPipe = pipeService.createInputPipe(pipeAdv);// 创建输入管道
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
System.out.println("等待其它Peer端信息的到达.........");
Message msg;
try {
msg = inputPipe.waitForMessage();// 监听输入管道是否有信息传进来
} catch (InterruptedException e) {
inputPipe.close();
System.out.println("接收其它Peer信息出错!");
return;// 如果出现异常则返回
}
String receiveContent = null;
Message.ElementIterator en = msg.getMessageElements();// 取得到信息
if (!en.hasNext()) {
return;
}
MessageElement msgElement = msg.getMessageElement(null, "DataTag");
if (msgElement.toString() != null) {
receiveContent = msgElement.toString();
}
if (receiveContent != null) {
System.out.println("接收信息内容: "
+ receiveContent);
} else {
System.out
.println("没有内容");
}
}
}
// 生成管道广告,在这里我们是直接从代码中生成管道广告,当然我们可以读管道广告文件
private PipeAdvertisement createPipeAdvertisement() {
PipeAdvertisement pipeAdvertisement = null;
pipeAdvertisement = (PipeAdvertisement) AdvertisementFactory
.newAdvertisement(PipeAdvertisement.getAdvertisementType());// 创建一个管道广告
pipeAdvertisement.setPipeID(createPipeID(peerGroupID));
pipeAdvertisement.setName("Pipe");
pipeAdvertisement.setDescription("JXTA create first pipe");
pipeAdvertisement.setType(PipeService.UnicastType);// 管道类型,管道类型在JXTA
return pipeAdvertisement;
}
// 生成管道ID
private PipeID createPipeID(PeerGroupID groupID) {
PipeID pipeID = null;
pipeID = IDFactory.newPipeID(groupID);
return pipeID;
}
}
先执行上面这个类,再执行下面PeerClient类。
public class PeerClient {
private PeerGroup netpg = null;// PeerGroup
private DiscoveryService disco; // 发现服务
private PipeService pipeSev; // 管道服务
private PipeAdvertisement pipeAdv = null;// 管道广告
private OutputPipe outputPipe;// 输入管道
public static void main(String[] args) {
Logger.getLogger("net.jxta").setLevel(Level.SEVERE);
PeerClient peer2 = new PeerClient();
peer2.launchJXTA();
}
private void launchJXTA() {
System.out.println("Lauching Peer into JXTA NetWork...");
try {
NetworkConfigurator config = new NetworkConfigurator();
config.setPrincipal("peer2");
config.setPassword("888888888");
config.save();
netpg = new NetPeerGroupFactory().getInterface();
} catch (Exception e) {
System.out.println("Unable to create PeerGroup - Failure");
System.exit(-1);
}
startClient();
}
private void startClient() {
System.out.println("搜索管道广告....");
disco = netpg.getDiscoveryService();//获取NetGroup发现服务
pipeSev = netpg.getPipeService();//获取NetGroup管道服务
Enumeration en;
while (true) {
try {
en = disco.getLocalAdvertisements(DiscoveryService.ADV, "Name",
"Pipe");// 本地发现广告,后面对应了广告中Name标签,值为Pipe的管道广告
if ((en != null) && en.hasMoreElements()) {
break;
}
disco.getRemoteAdvertisements(null, DiscoveryService.ADV,
"Name", "Pipe", 1, null);// 远程发现广告
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.print(".");
}
System.out.println("已经找到管道广告.......");
pipeAdv = (PipeAdvertisement) en
.nextElement();
if (null == pipeAdv) {
System.out.println("没有找到管道广告");
}
try {
outputPipe = pipeSev.createOutputPipe(pipeAdv, 10000);// 创建输出管道,其实是连接Peer1中的输入管道
} catch (IOException e) {
e.printStackTrace();
}
String data = "你是谁";// 我们要发送的信息内容
Message msg = new Message();
StringMessageElement sme = new StringMessageElement("DataTag", data,
null);
msg.addMessageElement(null, sme);
try {
outputPipe.send(msg);// 发送信息
System.out.println("信息 \"" + data
+ "\" 已经发送");
} catch (IOException e) {
e.printStackTrace();
System.out
.println("发送信息失败!!");
}
}
}
评论
我也发现了这个问题,第一次启动可以成功,第二次就报错了。我是把项目文件夹下面的".jxta"文件夹删除了再启动就好了,现在还没弄清楚到底什么原因。
实现广告是什么意思?
Lauching Peer into JXTA NetWork...
搜索管道广告....
已经找到管道广告.......
java.io.IOException: Output Pipe could not be resolved after 10000ms.
at net.jxta.impl.pipe.PipeServiceImpl.createOutputPipe(PipeServiceImpl.java:459)
at net.jxta.impl.pipe.PipeServiceImpl.createOutputPipe(PipeServiceImpl.java:416)
at net.jxta.impl.pipe.PipeServiceInterface.createOutputPipe(PipeServiceInterface.java:160)
at jxta_comunication.PeerClient.startClient(PeerClient.java:84)
at jxta_comunication.PeerClient.launchJXTA(PeerClient.java:51)
at jxta_comunication.PeerClient.main(PeerClient.java:36)
Exception in thread "main" java.lang.NullPointerException
at jxta_comunication.PeerClient.startClient(PeerClient.java:95)
at jxta_comunication.PeerClient.launchJXTA(PeerClient.java:51)
at jxta_comunication.PeerClient.main(PeerClient.java:36)
应该就是Output连不上了。请问这是什么问题?
你好 我也通过你提示我的信息找了相关的资料,其中 即把管道广告包含在实现广告中发布。 我做了测试 这种情况只有两端都建立默认组的情况下才能实现。如果一方建立组 另外一方加入此组 就找不到PipeAdvertisement. 也不知道是什么情况导致的。难道两个PEER在默认组 和两个PEER在自己建立的peergroup 是不一样的、
config.addSeedRelay(new URI("http://192.168.0.9:9702"),10);
config.addSeedRendezvous(new URI("http://192.168.0.9:9702"),10);
可能是我说的不太清楚,我用你的例子在一个远程服务器上建立了服务端,也就是你写的PEERSERVER类 在服务端运行
我的客户端是在我公司的子网里面 现在在子网运行你的PEERCILENT类时 互相都搜索不到对方。
另外像你这样的用代码跳过配置窗口。不用给服务器端配置Rendezvous 让服务器作为Rendezvous吗
我关于JXTA配置窗口的配置如下 不知道对不对 请牙哥指点下
服务器设置 在Basic 中 填写 peername 和 password
在 Advanced 中把服务器设置为 Act as a Rendezvous
TCP Settings中 给Manual设置自己的IP 加9701端口
在Rendezvous/Relays中 取消Use a rendezvous 和 Use a relay复选框
客户端设置
在Basic 中 填写 peername 和 password
在 Advanced 中 什么都不改
在Rendezvous/Relays中
在 Use a rendezvous 的 Rendezvous seed peers中填写
tcp://服务器IP:9701
取消 Use a relay复选框
我现在不清楚要是连接远程服务器是不是我配置的有问题。
你说的:“要用标准的方法来连接。即把管道广告包含在实现广告中发布。”
的标准方法连接是什么意思 普通连接是什么呢 。后面的意思有是什么呢?
我们平时发布广告不是用
DiscoveryService.publish 来发布本地广告
DiscoveryService.remotePublish 来发布远程广告
你说的实现广告中发布是什么意思呢?
发表评论
-
(JXTA P2P)利用监听DiscoveryListener发现远程广告
2010-05-17 21:47 1560最近朋友们一直都是问 ... -
JXTA中使用JxtaServerPipe和JxtaBiDiPipe实现双向可靠的通信
2010-04-14 00:18 1766前面我们讲到如何在JXTA中创建单向不可靠的通信渠道,本节我们 ... -
JXTA如何创建自定义的广告
2010-04-13 01:43 1688广告是JXTA核心对象,它是用来公布对等机,对等机,服务,管道 ... -
JXTA中双向可靠的信息渠道
2010-04-11 16:11 1101在前面我们讲到管道通信都是单向不可靠的。如果JXTA只提供它, ... -
JXTA中通过身份认证来加入“群”(三)
2010-04-10 19:05 1247本文是接前面两篇,结束本篇就完成密码对等组创建,发现及加入的过 ... -
JXTA中通过身份认证来加入“群”(二)
2010-04-10 15:44 1119本文是接前篇而写,所以一些前面讲过的东西在这里不再重复。想了解 ... -
JXTA中通过身份认证来加入“群”(一)
2010-04-10 11:28 1401之前讲的加入“群”,即对等组。都是不用认证的,只要发现了该“群 ... -
JXTA中基于管道监听方式通信
2010-04-09 21:25 1603在上一篇中“基于Pipe管 ... -
在JXTA中如何搜索目标对等组中的所有Peer
2010-04-07 23:22 1421在JXTA中发布和发现任何资源都是根据广告,因此,我们要发现P ... -
如何从HelloWorld开始学习JXTA
2010-04-07 22:12 2592本文主要从代码来讲解 ... -
JXTA的“名片”之一PeerAdvertisement(对等机广告)
2010-04-06 20:47 1297PeerAdvertisement(对等机广告)有两个最终的目 ... -
JXTA中的“名片”
2010-04-06 19:27 1350JXTA中的所谓“名片”,指的是JXTA语言中的广告,P2P网 ...
相关推荐
本实验旨在通过实践操作,帮助学习者深入理解管道的工作原理及其应用,并掌握如何使用管道来实现进程间的简单通信。 #### 实验内容 ##### 1. 了解系统调用`pipe()`的功能和实际原理 在Linux系统中,`pipe()`是一...
- 管道是Linux操作系统中的一种简单但有效的进程间通信(IPC, Inter-Process Communication)机制,它允许一个进程的输出作为另一个进程的输入。 - 在这个实验中,通过`pipe()`系统调用创建了一个单向的数据通道,...
其中,管道(pipe)作为一种最简单且高效的方式之一,被广泛应用于Unix及类Unix操作系统中。本文档将详细介绍如何使用管道来实现进程间的通信。 #### 二、基础知识 **1. 管道的概念** - **定义**:管道是一种特殊...
通过这个实验,学生可以深入理解进程间通信的重要性,以及如何利用管道这种简单的IPC机制实现数据传输。此外,实验也涉及到进程同步的概念,例如父进程等待子进程完成后再继续执行,这确保了数据正确地按顺序写入和...
匿名管道是操作系统提供的一种简单而基础的进程间通信(IPC, Inter-Process Communication)机制,尤其在早期的Unix系统和Windows系统中广泛应用。本示例程序将深入探讨如何使用匿名管道来实现两个进程之间的数据...
1. **管道(Pipe)**:管道是简单的单向通信通道,允许一个进程写入数据,另一个进程读取。在聊天应用中,可以利用管道传递用户的聊天消息到服务器,但不适用于两个客户端间的直接通信。 2. **消息队列(Message ...
7. **信号(Signal)**:信号是一种简单的进程间通信方式,用于通知进程发生了特定事件,如异常或者需要进程执行某些操作。 ### IPC 的应用场景 - **协同工作**:当多个进程需要协作完成一项任务时,例如一个进程...
1. **管道(Pipe)**:最简单的一种IPC方式,用于实现父子进程间的通信,具有单向性。 2. **有名管道(FIFO)**:与管道类似,但是具有名字,可以跨进程使用。 3. **信号(Signal)**:用于通知接收进程发生某些类型...
- **资源利用**:通过进程通信,进程可以共享数据,提高资源利用率,避免重复计算。 - **协同工作**:进程间通信使得多进程能协调执行,解决复杂问题,如分布式计算、并发服务等。 - **系统效率**:通过合理设计...
无名管道是最简单的IPC形式,通常用于父子进程之间的通信。它是一个半双工的通信通道,数据只能单向流动。创建时,管道连接在父进程与子进程之间,当父进程创建子进程后,它们可以通过管道共享数据。 **有名管道...
本文将详细介绍一个基于管道通信的示例程序,该程序由一个父进程和两个子进程组成,展示了如何利用管道来实现进程间的通信。 #### 二、示例程序解析 ##### 2.1 程序结构 示例程序通过C语言编写,主要包括以下部分...
管道适用于父子进程或兄弟进程之间的简单通信。 二、命名管道(Named Pipe) 与普通管道不同,命名管道可以在不具有亲缘关系的进程之间使用,因为它在文件系统中有一个固定的路径名。通过这个路径,任何有权限的...
1. **WM_COPYDATA** 消息:这是最简单且常见的进程间通信方式之一。一个进程可以发送`WM_COPYDATA`消息到另一个进程,携带不超过64KB的数据。在MFC中,可以使用`CWnd::SendMessage`或`CWnd::PostMessage`函数发送`WM...
举个例子,创建一个简单的管道通信的C程序,可以使用`pipe()`函数创建管道,`dup2()`重定向标准输入输出,`fork()`创建子进程,然后父子进程可以通过管道互相传递数据。 总结来说,理解和掌握C语言中关于进程的操作...
首先,管道(Pipe)是一种最基本的IPC方法,它允许一个进程和另一个进程之间进行单向数据流通信。管道分为匿名管道和有名管道(FIFO)。匿名管道使用起来较为简单,但由于其没有名字,只能在具有亲缘关系的进程间...
1. **管道(Pipe)**:管道是最简单的IPC形式,它提供一个单向的数据流,可以将数据从一个进程传递到另一个进程。管道分为无名管道和命名管道(FIFO)。无名管道仅适用于具有亲缘关系的进程,如父子进程之间;命名...
- 实现:通过`pipe()`函数创建管道,利用`fork()`函数创建子进程,然后分别使用`write()`和`read()`进行数据交换。 2. **消息队列(Message Queue)**: - 简介:消息队列允许进程之间发送消息,而无需知道接收者是...
在Delphi编程环境中,我们可以利用多种方法实现IPC,本实例将探讨一个简单的方法。 首先,我们要了解Delphi中的几个基本概念。Delphi是一个基于Object Pascal的集成开发环境,它提供了丰富的API和组件库来支持进程...
**管道(pipe)**是一种最基本的进程间通信(IPC)机制,允许两个进程之间通过共享内存区域进行数据交换。管道支持半双工操作模式,即数据只能在一个方向上传输。一般情况下,读取管道的一方会关闭管道的写入端,而写入...
1. **管道(pipe)和有名管道(FIFO)**:管道是一种最简单的进程间通信方式,用于连接一个进程的输出和另一个进程的输入,实现单向的数据流动。有名管道(FIFO)则可以在文件系统中持久化,允许非相关进程间通信。 ...