【序列化message传输方式】两种方式都是转成二进制。

1.使用Java序列化器,ObjectXXXputStream

2.使用ByteBuffer.wrap(bytes)。

在一个标准群集场景中,节点通过一个数据包发送到协定好的多播IP地址:Port上,建立起通信。比如使用TCP插头。

【使用Servlet模拟群集场景】

【1.连接上@ServerEndPoint】

【节点做的事】

//ws://localhost:8080/cluster/clusterNodeSocket/clusterNode1/query
URI uri = new URI("ws", "localhost:8080", path, null, null); //连接上websocket
this.session = ContainerProvider.getWebSocketContainer()
.connectToServer(this, uri); 【Server做的事】
     public void onOpen(Session session, @PathParam("nodeId") String nodeId)
{
ClusterMessage message = new ClusterMessage(nodeId, "Joined the cluster."); //通知所有节点 有新的节点加入 因为这是在onOpen发生的,也就是终端连接上的代表加入
byte[] bytes = ClusterNodeEndpoint.toByteArray(message);
for(Session node : ClusterNodeEndpoint.nodes)
//发送ByteBuffer 因为ClusterMessage实现了序列化,想要在websocket上传送序列化数据,必须做成二进制。
node.getBasicRemote().sendBinary(ByteBuffer.wrap(bytes)); ClusterNodeEndpoint.nodes.add(session);
}

【2.Servlet负责路由请求和接收消息、Server负责传递给其他节点消息】

【节点处理get请求】

     protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//构造Message准备发给节点
ClusterMessage message = new ClusterMessage(this.nodeId,
"request:{ip:\"" + request.getRemoteAddr() +
"\",queryString:\"" + request.getQueryString() + "\"}"); //使用序列化机制发送消息
try(OutputStream output = this.session.getBasicRemote().getSendStream();
ObjectOutputStream stream = new ObjectOutputStream(output))
{
stream.writeObject(message);
}
response.getWriter().append("OK");
}

【节点接收消息】

  @OnMessage
public void onMessage(InputStream input)
{
try(ObjectInputStream stream = new ObjectInputStream(input))
{
ClusterMessage message = (ClusterMessage)stream.readObject();
System.out.println("INFO (Node " + this.nodeId +
"): Message received from cluster; node = " +
message.getNodeId() + ", message = " + message.getMessage());
}
catch(IOException | ClassNotFoundException e)
{
e.printStackTrace();
}
}

【Server传递给其他节点消息】

 @OnMessage
public void onMessage(Session session, byte[] message)
{
try
{
for(Session node : ClusterNodeEndpoint.nodes)
{
//向其他节点发送消息(消息来自当前节点)
if(node != session)
node.getBasicRemote().sendBinary(ByteBuffer.wrap(message));
}
}
catch(IOException e)
{
System.err.println("ERROR: Exception when handling message on server");
e.printStackTrace();
}
}

使用WebSocket帮助应用程序群集节点间通信的更多相关文章

  1. RAC 安装完成后 节点间通信不依赖于SSH

    RAC 安装完成后,想修改ssh 的端口.google了一下.原文https://community.oracle.com/thread/2444594?tstart=0 原文说的是11g,10g也好 ...

  2. elasticsearch节点间通信的基础transport

    在前一篇中我们分析了cluster的一些元素.接下来的章节会对cluster的运作机制做详细分析.本节先分析一些transport,它是cluster间通信的基础.它有两种实现,一种是基于netty实 ...

  3. TinyOS节点间通信相关接口和组件介绍

    一.基本通信接口:   Packet:提供了对message_t抽象数据类型的基本访问.这个接口的命令有:清空消息内容,获得消息的有效载荷区长度,获得消息有效载荷区的指针. //tos/interfa ...

  4. 集群节点间网络通信TIPC

    1. TIPC背景介绍 TIPC主要是用于集群网络环境之中,它这个协议有一些前提假设包括: 协议发送的大部分message都是直接到达目的地(无路由): message的传输时间都很短; messag ...

  5. BFT-SMaRt:用Java做节点间的可靠信道

    目录 一.引子 二.名词统一 1. 节点id 2. 节点 3. 本地节点 4. 配置域 5. TTP 6. 陌生域 三.节点服务类 四.节点通信系统概览 五.节点通信层准备 1. 创建socket服务 ...

  6. Cassandra1.2文档学习(2)——节点间通信协议之gossip协议

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...

  7. (六)ROS话题---节点之间通信的方式

    1. 理解 ROS 话题: (Ctrl+Alt+T 打开一个新终端) 运行下面的命令: $ roscore (Ctrl+Alt+T 打开一个新终端) $ rosrun turtlesim turtle ...

  8. Blazor入门笔记(6)-组件间通信

    1.环境 VS2019 16.5.1.NET Core SDK 3.1.200Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.简介 在使用B ...

  9. 《程序员代码面试指南》第三章 二叉树问题 Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题

    题目待续.... Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题 java代码

随机推荐

  1. VCC、VDD和VSS

    在电子电路中,常可以看到VCC.VDD和VSS三种不同的符号,它们有什么区别呢? 一.解释 VCC:C=circuit 表示电路的意思, 即接入电路的电压:  VDD:D=device 表示器件的意思 ...

  2. 对于Spring中注入对象失败的问题

    1.今天进行了一段代码,经过检查发现config配置文件没问题,注入注解也编写正确,但是RedisTemplate就是会抛出空指针异常. 进过一系列检查发现,其在用户使用该类的时候采用的是new方式创 ...

  3. 洛谷P2414 阿狸的打字机

    题意:以trie的形式给出n个字符串,每次询问第x个字符串在第y个字符串中出现了几次. 解:总串长是n2级别的,所以不能用什么后缀自动机... [update]可以建triesam但是不知道trie上 ...

  4. CF1129D Isolation(分块+DP)

    一个很显然的DP方程式:f[i]=Σf[j],其中j<i且在[j+1,i]中出现1次的数不超过k个 乍一看挺神仙的,只会O(n^2),就是对于每个位置从后向前扫一遍,边扫边统计出现1次的数的个数 ...

  5. 团体程序设计天梯赛(CCCC) L3012 水果忍者 上凸或下凹的证明

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code #include <cstdio> #include ...

  6. Tree Restoration Gym - 101755F (并查集)

    There is a tree of n vertices. For each vertex a list of all its successors is known (not only direc ...

  7. WPF开发的界面调用C++生成的dll文件

    以引用d1.dll为例. [生成d1.dll] 文件——新建——项目——Visual C++——Win32项目,选择DLL,点击Finish.在d1.cpp中添加代码 #include "s ...

  8. 关于JAVA-JS-JSP之间传值的各种方法

    https://blog.csdn.net/murex_dustyone/article/details/52945552 这篇博文写的非常好,保存下来,一起学习

  9. league之csv导出

    有的时候当我们导出文件时,如果文件比较小可以使用phpexcel,但是当文件太大时就会遇到很多瓶颈(excel条数限制.导出时间太长等). 这个时候要么使用excel分批次导出,要么就需要使用csv导 ...

  10. day05-(validate&bootstred)

    网站分享: http://www.runoob.com/ 回顾: html:展示 文件 标签: <html> <head> <title></title> ...