Web套接字 - 将数据发送回同一客户端

时间:2016-05-12 02:54:34

标签: html5 websocket stomp spring-websocket sockjs

我正在使用Spring 4 Web套接字。 我有一个STOMP客户端。我想从客户端向STOMP服务器发送消息,STOMP服务器应该将数据返回给发送数据的同一个客户端。

这是我的代码。在WebSocketConfig中,我使用队列作为消息代理。

WebSocketConfig.java

package com.apple.store.datamonitor.dashboard.config;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.WebSocketHandler;
//import org.springframework.web.socket.config.WebSocketMessageBrokerStats;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

import com.apple.store.datamonitor.dashboard.websocket.ChartHandler;


@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {


    @PostConstruct
    public void init() {
//        webSocketMessageBrokerStats.setLoggingPeriod(10 * 1000); // desired time in millis
    }
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/charthandler").withSockJS();
    }

    @Bean
    public WebSocketHandler chartHandler() {
        return new ChartHandler();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/queue");
        config.setApplicationDestinationPrefixes("/app");
    }

}

ChartUpdateHandler.java。

问候方法中的代码与此问题无关。假设它将一个简单的对象返回给客户端。

package com.apple.store.datamonitor.dashboard.websocket.controller;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

import com.apple.store.datamonitor.dashboard.domain.chart.BarData;
import com.apple.store.datamonitor.dashboard.domain.chart.BarDataWrapper;
import com.apple.store.datamonitor.dashboard.domain.report.Result;

@Controller
public class ChartUpdateController {

    private static final Logger log = LoggerFactory.getLogger(ChartUpdateController.class);

    @MessageMapping("/charthandler")
    @SendTo("/queue/update")
    public BarDataWrapper greeting(Result r) throws Exception {
//        Thread.sleep(3000); // simulated delay
        BarData data1 = new BarData(2, 0, 10, 0, 0, 0, 0, 2);
        data1.setYaxis("11-05-2016 01:00:00");
        List list1= new ArrayList<BarData>() {
            {
                add(data1);
            }
        };
        BarData data2 = new BarData(5, 10, 50, 1, 1, 1, 2, 3);
        data2.setYaxis("11-05-2016 01:00:00");
        List list2= new ArrayList<BarData>() {
            {
                add(data2);
            }
        };
        BarDataWrapper bd = new BarDataWrapper(list1, list2);
        return  bd;
    }

}

@MessageMapping(/ charthandler) - 用于stomp客户端将数据发送到服务器 @SendTo(“/ queue / update”) - 这是服务器将数据推送回队列的地方。服务器客户端将监听队列。

这是我的Javascript。

    $(document).ready(function() {
      var socket = new SockJS('/datamonitordashboard/charthandler/');
      stompClient = Stomp.over(socket);
      stompClient.connect({}, function(frame) {
        console.log('Connected: ' + frame);

        stompClient.subscribe('/queue/update', function(result) {
          console.log("l2 " + JSON.parse(result.body).l2List);

        });
      });
      $('#sendInfo').click(function(e) {
    sendData();
  });
    }

    function sendData() {
      var result = {
        title: "hello",
        sortOrder: "desc",
      };
      console.log(JSON.stringify(result));
      stompClient.send("/app/charthandler", {
        priority: 9
      }, JSON.stringify(result));
    }

在DOM准备好之后,我连接到stomp服务器,我正在使用bind绑定sendData()方法。现在它将数据发送到stomp服务器。

现在我打开了2个浏览器。从第一个浏览器我单击发送按钮,它将结果对象推送到StompServer,STOMP服务器将数据返回到第二个浏览器,这意味着,我在第二个浏览器中看到日志输出。  console.log(“l2”+ JSON.parse(result.body).l2List);

我想从客户端(浏览器1)向STOMP服务器发送消息,STOMP服务器应该将数据返回给同一个客户端(浏览器1)?它是如何做到的?

如果我将消息代理更改为主题而不是队列,则在我的WebSocketConfig中,它将消息发送到客户端浏览器1和浏览器2.我想将数据发送回同一客户端?

config.enableSimpleBroker( “/话题”);

我需要改变方法吗?针对上述问题的任何解决方案?

0 个答案:

没有答案
相关问题