P2P点对点进行通讯是在管道进行通讯的。
主要是PipeAdvertisement:管道通告 InputPipe:输入管道,用于接收消息 OutputPipe:输出管道用于发送消息
package first;import java.io.IOException;
import java.util.Enumeration;import net.jxta.discovery.DiscoveryService;
import net.jxta.document.Advertisement;
import net.jxta.document.AdvertisementFactory;
import net.jxta.endpoint.Message;
import net.jxta.endpoint.Message.ElementIterator;
import net.jxta.endpoint.MessageElement;
import net.jxta.endpoint.StringMessageElement;
import net.jxta.id.IDFactory;
import net.jxta.peergroup.PeerGroup;
import net.jxta.pipe.InputPipe;
import net.jxta.pipe.OutputPipe;
import net.jxta.pipe.PipeService;
import net.jxta.platform.NetworkConfigurator;
import net.jxta.platform.NetworkManager;
import net.jxta.platform.NetworkManager.ConfigMode;
import net.jxta.protocol.PipeAdvertisement;public class Chat {private NetworkManager networkManager = null;// 配置private PeerGroup netWorkPeerGroup = null;// 对等组private DiscoveryService discoveryService = null;// 发现服务private PipeService pipeService = null;// 管道服务private InputPipe inputPipe = null;// 输入管道private OutputPipe outputPipe = null;// 输出管道Enumeration<Advertisement> enumeration = null;// 初始化配置public void init(String name) {try {// 相当于jxta的配置,如果不写的话会出现配置页面,手动配置也可networkManager = new NetworkManager(ConfigMode.ADHOC, name);// 在一台pc测试的时候,端口号不能一致,这里修改下端口号NetworkConfigurator configurator = networkManager.getConfigurator();configurator.setTcpPort(9703);configurator.save();// 启动创建对等组// netWorkPeerGroup=new NetPeerGroupFactory().getInterface();netWorkPeerGroup = networkManager.startNetwork();// 初始化discoveryService和pipeServicediscoveryService = netWorkPeerGroup.getDiscoveryService();pipeService = netWorkPeerGroup.getPipeService();} catch (Exception e) {e.printStackTrace();}}// 创建一个管道通告public PipeAdvertisement createPipeAdvertisement(String name) {PipeAdvertisement advertisement = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(PipeAdvertisement.getAdvertisementType());advertisement.setPipeID(IDFactory.newPipeID(netWorkPeerGroup.getPeerGroupID()));advertisement.setName(name);advertisement.setType(PipeService.UnicastType);return advertisement;}// 发布通告public void publish(PipeAdvertisement advertisement) {try {discoveryService.publish(advertisement);discoveryService.remotePublish(advertisement);} catch (IOException e) {e.printStackTrace();}}// 初始化管道public void initPipe(String name) {// 管道通告,相当于名片PipeAdvertisement advertisement = createPipeAdvertisement(name);// 发布 告诉别人我是谁publish(advertisement);try {// 初始化管道inputPipe = pipeService.createInputPipe(advertisement);// 输入通道} catch (IOException e) {e.printStackTrace();}}// 找你想聊的人public PipeAdvertisement discover(String name) {int count = 3;// 担心一次连不上while (count-- > 0) {try {// 先从本地缓存里头找enumeration = discoveryService.getLocalAdvertisements(DiscoveryService.ADV, "Name", name);if (enumeration != null && enumeration.hasMoreElements()) {PipeAdvertisement pipeAdvertisement = (PipeAdvertisement) enumeration.nextElement();return pipeAdvertisement;}discoveryService.getRemoteAdvertisements(null,DiscoveryService.ADV, "Name", name, 1, null);} catch (IOException e) {e.printStackTrace();}}return null;}// 发送信息public void sendMessage(String name, String msg) {try {outputPipe = pipeService.createOutputPipe(discover(name), 0);// 发送的信息Message message = new Message();StringMessageElement string = new StringMessageElement("data", msg,null);message.addMessageElement(string);outputPipe.send(message);} catch (IOException e) {e.printStackTrace();}}// 接收消息public void receiveMessage() {while (true) {try {// 接收Message message = inputPipe.waitForMessage();// 解析获取到的信息ElementIterator messageElements = message.getMessageElements();if (messageElements != null) {while (messageElements.hasNext()) {MessageElement next = messageElements.next();System.out.println("接收到消息:" + next.toString());}}} catch (InterruptedException e) {e.printStackTrace();}}}public void stop() {// 停止服务networkManager.stopNetwork();}public void start() {init("peer1");initPipe("peer1");discover("peer2");sendMessage("peer2", "hello!!!!");}public static void main(String[] args) {Chat chat = new Chat();chat.start();}
}
还有一种是基于监听事件的接收消息PipeMsgListener
Chat implements PipeMsgListener后
@Override
public void pipeMsgEvent(PipeMsgEvent event) {
Message message = event.getMessage();
// 解析获取到的信息
ElementIterator messageElements = message.getMessageElements();
if (messageElements != null) {
while (messageElements.hasNext()) {
MessageElement next = messageElements.next();
System.out.println("接收到消息:" + next.toString());
}
}
}
只要有消息发送过来就可以接收到。

JXTA 点对点管道通信相关推荐

  1. php proc open 返回,PHP用proc_open新建子进程使用管道通信非阻塞执行PHP脚本

    PHP用proc_open新建子进程使用管道通信非阻塞执行PHP脚本. 脚本结束时register_shutdown_function回调函数访问管道获取子进程输出的数据. 例子1(popen): f ...

  2. php管道邮件,php进程通信-PIPE管道通信

    上一篇文章讲到了php进程通信的进程信号通信方法,本文介绍的是有名管道: 管道通信,主要是利用文件,写入以及读取来进行通信的, 通俗来讲,就是A进程在1.txt写入1,B进程读取1.txt,就能读取到 ...

  3. 2.1.4 进程之间的通信(共享通信、消息传递、管道通信)

    文章目录 0.思维导图 1.什么是进程通信? 2.共享存储 3.管道通信 4.消息传递 0.思维导图 1.什么是进程通信? 图中我们可以知道什么是进程通信,以及进程通信的低级和高级方式: 我们还可以知 ...

  4. CreatePipe匿名管道通信

    管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机.一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来.匿名管道(An ...

  5. C++管道通信类封装

    简单的介绍一下,管道通信类 指的是 IPC通信中的一种,即两个不同的进程之间的通信 现在实现一下管道通信类,方便以后调用使用 头文件(引用相关的库) // stdafx.h : 标准系统包含文件的包含 ...

  6. linux管道通信题目,操作系统实训(Linux)——习题解答、例题解析、实验指导-王红-实验实验7软中断及管道通信课案.ppt...

    操作系统实训(Linux)--习题解答.例题解析.实验指导-王红-实验实验7软中断及管道通信课案.ppt 实验7 软中断及管道通信 一.实验目的(1)掌握linux系统软中断通信的实现方法.(2)掌握 ...

  7. linux 进程和线程或线程和线程之间通过管道通信(pipe)

    linux 进程和线程或线程和线程之间通过管道通信(pipe) 转自:http://blog.csdn.net/robertkun/article/details/8095331 线程间通信: [cp ...

  8. 实验四:《操作系统》之管道通信

    Part4. 管道通信 往期回顾: Part0. 实验环境 Part1-1.熟悉UKylin环境 Part1-2.熟悉UKylin环境 Part2.进程控制 Part3.进程通信 一.实验目的 1.了 ...

  9. 种基于局域网的点对点语音通信

    引 言 随着计算机网络的日益普及,人们通过网络进行交流显得越来越重要,于是出现了一系列语音通信的软件,比如NetMeeting.IPPhone.MediaRing以及VoxPhone等等,但这些软件都 ...

最新文章

  1. linux安装mysql5.6.26_linux mysql-5.6.26 安装
  2. 220V电容启动交流电机
  3. UA MATH523A 实分析3 积分理论 概念与定理整理
  4. 时域和频域的麦克斯韦方程组
  5. [Python Study Notes]正则表达式
  6. zsh关于.zprofile .zlogin .zshrc .zshenv文件中环境变量的加载
  7. [专栏精选]Unity动画系统的RootMotion
  8. 借势新基建,如何在智能基础设施布一盘大局?
  9. python面试之腾讯测试开发工程师
  10. android 清理 app,最好用的五大手机清理APP
  11. 关于数据库中存储密码的加密
  12. canvas实现矩形框,用来进行图片框选
  13. 曾国藩读书的十二条规矩
  14. Java实战项目《瑞吉外卖》
  15. Deployer 部署项目
  16. hosts文件修改后域名无法访问
  17. debug - UITextField 输入完跳入下一field,按钮变化
  18. 顾盼华发鸿蒙怦然而梦是什么意思,最美的承诺情话
  19. Oracle的emp表的基本函数学习
  20. 杨校老师课堂之Maven下载与配置阿里云镜像

热门文章

  1. 【分布式】CAP原则和BASE理论
  2. 电脑的屡次黑屏原因为:CPU中央处理器利用率达到了100%并持续了多秒从而导致
  3. 8位有符号类型的数值范围是-128~127,why -128?
  4. Web 开发与搜索引擎优化,你应该选择哪一个?
  5. 一次 WIN7X64无法定位序数“3906”于动态链接库LIBEAY32.dll处理记录
  6. 关于vs2022 C6031 “scanf返回值被忽略”的解决办法
  7. ks(洛伦兹曲线)指标理解
  8. java修改图片rgb_java图片色阶调整和亮度调整代码示例
  9. 克隆系统怎么保护服务器,克隆系统引起MSDTC服务工作不正常
  10. 从云服务器 SSRF 漏洞到接管你的阿里云控制台