JBoss 系列十二:基于jGroups的群组聊天程序

内容概述

JBoss 系列十二通过一个简单群组聊天程序演示“JBoss 系列九: Bela Ban's JGroups Manual 翻译 III - JGroups API”中JGroups API的使用,希望读者能够通过本示例知道如何使用JGroups API构建自己的多播通信应用。本系列内容包括:

  • 编译打包生成DEMO_HOME目录
  • 运行聊天程序
  • 代码及结果分析 

编译打包生成DEMO_HOME目录

使用示JBoss Cluster Framework Demo 介绍所示的方法,任意从SourceForge下载或编译生成DEMO_HOME(为了方便描述,我们编译生成的Demo目录,或解压jboss_cluster_framework.*.zip得到的Demo目录称之为DEMO_HOME)。DEMO_HOME/bin目录下包含启动群组聊天程序的启动脚本(chat.sh,chat.bat)。

运行聊天程序

使用启动脚本附加-n参数指定群组的节点名字如下:

./chat.sh -n node1
  • -n node1 表示群组中该节点的名字为node1

./chat.sh -n node2

  • -n node2 表示群组中该节点的名字为node2

注意:Windows系统下使用chat.bat。

到此node1和node2可以进行聊天,互相发送消息,事实上我们可以启动多个节点,多个节点中的任何一个节点可以发送消息给其他节点,当然多个节点中的任何一个节点都可以收到其他节点发送的消息,下图为两个节点群组聊天示意图。



代码及结果分析 

本示例完整代码链接:https://github.com/kylinsoong/cluster/.../jgroups/demo/ChatDemo.java

31  public class ChatDemo extends ReceiverAdapter

        如上ChatDemo31行代码,ChatDemo类继承ReceiverAdapter,ReceiverAdapter定义了receive(Message msg),viewAccepted(View new_view)等方法,这些方法负责接收群组消息,处理群组中成员变化,初始化群组状态等。本示例重写了这些方法,如下为代码片段:

40         public void receive(Message msg) {
 41                 Address sender = msg.getSrc();
 42                 println("[" + sender + "] " + msg.getObject());
 43         }
 44

        如上40-43行为重写的receive()方法,该方法负责处理接收到群组消息,这里我们只是将收到的消息消息的发送者和消息内容打印输出;45-47行为重写的viewAccepted()方法,当群组中的成员发生变化(新成员加入,或已有成员退出)时,该方法被调运,我能这里只是简单打印输出当前视图。

52                 channel = new JChannel();
 53                 if(null != name) {
 54                         channel.setName(name);
 55                 }
 56                 channel.setReceiver(this);
 57                 channel.setDiscardOwnMessages(true);
 58                 channel.connect(clusterName);

        如上52行初始化了一个通道,JChannel构造方法如果没有参数传递时,默认classpath下的udp.xml被使用;54行设定当前通道的名字,我们看到的节点名字node1,node2是在此处设定的;56行设定通道接收者,由于ChatDemo类继承ReceiverAdapter类,所以这行代码使我们重写的receive()和viewAccepted()方法起作用;57行忽略自己发送的消息,jGroups使用多播机制传递消息,所有物理网络地址都会接收到群组消息,该行代码过滤掉自己发送给自己的消息;58行使通道处于连接状态,通道只有在连接状态才可以接收和发送消息给群组中的成员。

转载于:https://my.oschina.net/iwuyang/blog/197147

猜你喜欢

转载自blog.csdn.net/weixin_33979363/article/details/91897395