两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() 就得到了消息内容了。