使用WebSocket帮助应用程序群集节点间通信

【序列化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做的事】
 2     public void onOpen(Session session, @PathParam("nodeId") String nodeId)
 3     {
 8         ClusterMessage message = new ClusterMessage(nodeId, "Joined the cluster.");

11 //通知所有节点 有新的节点加入 因为这是在onOpen发生的,也就是终端连接上的代表加入 12 byte[] bytes = ClusterNodeEndpoint.toByteArray(message); 13 for(Session node : ClusterNodeEndpoint.nodes) 14 //发送ByteBuffer 因为ClusterMessage实现了序列化,想要在websocket上传送序列化数据,必须做成二进制。 15 node.getBasicRemote().sendBinary(ByteBuffer.wrap(bytes));

22 ClusterNodeEndpoint.nodes.add(session); 23 }

 

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

【节点处理get请求】

 2     protected void doGet(HttpServletRequest request, HttpServletResponse response)
 3             throws ServletException, IOException
 4     {
 6         //构造Message准备发给节点
 7         ClusterMessage message = new ClusterMessage(this.nodeId,
 8                 "request:{ip:\"" + request.getRemoteAddr() +
 9                 "\",queryString:\"" + request.getQueryString() + "\"}");
10 
11         //使用序列化机制发送消息
12         try(OutputStream output = this.session.getBasicRemote().getSendStream();
13             ObjectOutputStream stream = new ObjectOutputStream(output))
14         {
15             stream.writeObject(message);
16         }
17         response.getWriter().append("OK");
18     }

【节点接收消息】

 1  @OnMessage
 2     public void onMessage(InputStream input)
 3     {
 4         try(ObjectInputStream stream = new ObjectInputStream(input))
 5         {
 6             ClusterMessage message = (ClusterMessage)stream.readObject();
 7             System.out.println("INFO (Node " + this.nodeId +
 8                     "): Message received from cluster; node = " +
 9                     message.getNodeId() + ", message = " + message.getMessage());
10         }
11         catch(IOException | ClassNotFoundException e)
12         {
13             e.printStackTrace();
14         }
15     }

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

 1 @OnMessage
 2     public void onMessage(Session session, byte[] message)
 3     {
 4         try
 5         {
 6             for(Session node : ClusterNodeEndpoint.nodes)
 7             {
 8                 //向其他节点发送消息(消息来自当前节点)
 9                 if(node != session)
11                     node.getBasicRemote().sendBinary(ByteBuffer.wrap(message));
12             }
13         }
14         catch(IOException e)
15         {
16             System.err.println("ERROR: Exception when handling message on server");
17             e.printStackTrace();
18         }
19     }

 

转载于:https://www.cnblogs.com/chenhui7373/p/8654592.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值