`
yangjiangong
  • 浏览: 14012 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

两Peer之间如何通过 JxtaBidiPipe相互通信

    博客分类:
  • JXTA
阅读更多

两Peer之间如何通过 JxtaBidiPipe相互通信

 

 

JxtaBidiPipe是通过巧妙的实现InputPipe和OutputPipe来完成双向通信的。通过JxtaBidiPipe方式进行双向通信,需要用到两个类:JxtaServerPipe和JxtaBidiPipe。实际完成通信任务的是JxtaBidiPipe类。但是双方通信前需要建立起这个连接,因此就用到了JxtaServerPipe类:该类首先站在那里等待连接请求,当有某人要求连接时,双方就开始建立实际的双向连接,也就是JxtaBidiPipe类开始生成并工作了。通信的双方我们暂且把一个称作“服务器端”,另一个称作“客户端”,下面我描述他们的通信过程,你就明白我这样称呼是有道理的。它们的通信过程是:

1、 服务器端先运行,它自然获得了 NetworkManager PeerGroup 等对象。紧接着开始正式工作了: 它首先应获得一个JxtaServerPipe的实例:

JxtaServerPipe serverPipe = new JxtaServerPipe(netPeerGroup, 

                                              pipeAdv );

它的作用是开始等待随时有某个客户端前来要求通信。获得实例时需要两个参数,一个netPeerGroup是服务器 端平台的默认对等组。另一个 pipeAdv 是一个管道通告 PipeAdvertisement 的对象。要注意在客户端也要用到这个相同的通告,这一点同InputPipe、OutputPipe的情况相同。

 

2、 然后调用语句:
JxtaBiDiPipe bi di pipe = serverPipe.accept() ;
这时候服务器端就开始等待客户端的连接请求了。当然,线程也会在此阻塞住。任何时候某客户端发出连接请求被服务器端的这句所接收,则获得了 JxtaBiDiPipe  的对象 bi di pipe  。此时线程自然结束,下面就可以使用这个 JxtaBiDiPipe  进行双向通信了。

3、 在客户端方面,同样,在 JXTA 平台启动后, 自然也获得了 NetworkManager PeerGroup 等对象。这时候开始正式工作了:通过语句
JxtaBiDiPipe   bi di pipe =  new  JxtaBiDiPipe( peergroup ,

                              pipeAdv , 20000,  this true );

开始向服务器端发起连接请求,如第2步所述,服务器端本来已经在那里等待这个请求了。当收到这个请求后,服务器端和这里的客户端就都得到了这个 JxtaBiDiPipe 类的对象了,它们就开始通过这个对象进行双向通信。在说明如何进行双向通信之前,我先解释 一下刚才双方是如何“握手”到一起的:

在第1步中服务器端创建了 JxtaServerPipe 类的对象时有一个参数就是 pipeAdv ,而在客户端申请连接(即本步中创建 JxtaBiDiPipe 的对象   )也有一个参数 pipeAdv ,这就是双方联系的纽带。这是一个管道通告,只要双方通过这个相同的通告来建立连接,那么它们就是可以“走到一起的”。

4、 双方建立了连接后,就可以通过它们所共有的 JxtaBiDiPipe   的对象 bi di pipe  进行通信了。当双方任何谁想要发送消息时,就先将要发送的消息封装成一个Message对象,然后通过语句: bi di pipe  .sendMessage(msg)发送给对方了。

5、 那么双方如何接收消息呢?因为消息是随时可以到来的,所接收一定是异步的了。这里就需要用到“消息监听器”了,具体来说是:

第一、 先将双方的类实现消息监听接口,例如类的声明可以是:

public class JxtaBidiPipeExample implements PipeMsgListener{}

第二、 当然,实现了这个监听接口后,自然就要求你必须实现一个方法了,那就是方法: public   void  pipeMsgEvent(PipeMsgEvent event) { }。任何时候有消息到来时,这个方法就被自动调用。所以,你要如何处理所接收的消息,就在这个方法里处理就可以了。具体来说一般有两步: Message msg = event.getMessage()

MessageElement msgElement = msg.getMessageElement( "MSG" );

最后,通过语句: msgElement .toString() 就得到了消息内容了。

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics