GVKun编程网logo

Spring WebSocket发送给特定的人(spring websocket stomp)

25

本文将介绍SpringWebSocket发送给特定的人的详细情况,特别是关于springwebsocketstomp的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时

本文将介绍Spring WebSocket发送给特定的人的详细情况,特别是关于spring websocket stomp的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Java Spring测试多个发送消息WebSocket、java WebSocket的实现以及Spring WebSocket示例代码、java – Spring websocket发送给特定的人、java – 使用sockjs stomp over socket无法连接Spring 4 WebSocket的知识。

本文目录一览:

Spring WebSocket发送给特定的人(spring websocket stomp)

Spring WebSocket发送给特定的人(spring websocket stomp)

我为spring-web应用程序添加了基于自定义令牌的身份验证,并将其扩展到spring websocket,如下所示

public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {    @Override    public void configureMessageBroker(MessageBrokerRegistry config) {        config.enableSimpleBroker("/topic", "/queue");        config.setApplicationDestinationPrefixes("/app");        config.setUserDestinationPrefix("/user");    }    @Override    public void registerStompEndpoints(StompEndpointRegistry registry) {        registry.addEndpoint("/gs-guide-websocket").setAllowedOrigins("*").withSockJS();    }    @Override      public void configureClientInboundChannel(ChannelRegistration registration) {        registration.setInterceptors(new ChannelInterceptorAdapter() {            @Override            public Message<?> preSend(Message<?> message, MessageChannel channel) {                StompHeaderAccessor accessor =                    MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);                if (StompCommand.CONNECT.equals(accessor.getCommand())) {                    String jwtToken = accessor.getFirstNativeHeader("Auth-Token");                        if (!StringUtils.isEmpty(jwtToken)) {                            Authentication auth = tokenService.retrieveUserAuthToken(jwtToken);                            SecurityContextHolder.getContext().setAuthentication(auth);                            accessor.setUser(auth);                            //for Auth-Token ''12345token'' the user name is ''user1'' as auth.getName() returns ''user1''                        }                }                return message;            }        });      }}

连接到套接字的客户端代码是

var socket = new SockJS(''http://localhost:8080/gs-guide-websocket'');    stompClient = Stomp.over(socket);    stompClient.connect({''Auth-Token'': ''12345token''}, function (frame) {        stompClient.subscribe(''/user/queue/greetings'', function (greeting) {            alert(greeting.body);        });    });

从我的控制器发送消息为

messagingTemplate.convertAndSendToUser("user1", "/queue/greetings", "Hi User1");

对于auth令牌12345token,用户名是user1。但是,当我向发送消息时user1,它在客户端未收到。我有什么想念的吗?

答案1

小编典典

在您的Websocket控制器中,您应该执行以下操作:

@Controllerpublic class GreetingController {    @Autowired    private SimpMessagingTemplate messagingTemplate;    @MessageMapping("/hello")    public void greeting(Principal principal, HelloMessage message) throws  Exception {        Greeting greeting = new Greeting();        greeting.setContent("Hello!");        messagingTemplate.convertAndSendToUser(message.getToUser(), "/queue/reply", greeting);    }}

在客户端,您的用户应订阅主题/ user / queue / reply。

您还必须添加一些目标前缀:

@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {    @Override    public void configureMessageBroker(MessageBrokerRegistry config) {        config.enableSimpleBroker("/topic", "/queue" ,"/user");        config.setApplicationDestinationPrefixes("/app");        config.setUserDestinationPrefix("/user");    }/*...*/}

当服务器在/ app / hello队列上收到消息时,它应该向dto中的用户发送消息。用户必须等于用户的主体。

我认为您代码中的唯一问题是您的“ /用户”不在目标前缀中。您的问候语消息被阻止,因为您将其发送到以/ user开头的队列中,并且未注册此前缀。

您可以在git repo上查看源代码:https : //github.com/simvetanylen/test-spring-
websocket

希望它能起作用!

Java Spring测试多个发送消息WebSocket

Java Spring测试多个发送消息WebSocket

如何解决Java Spring测试多个发送消息WebSocket?

我正在遵循Java Spring的本教程:https://spring.io/guides/gs/messaging-stomp-websocket/。

但是,他们目前设置的测试程序仅允许一条发送消息。如果我用多条替换该发送消息,则该代码似乎只注册了第一条发送消息。您可以在this file上查看测试设置。

如何在同一测试方法上测试多条发送消息?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

java WebSocket的实现以及Spring WebSocket示例代码

java WebSocket的实现以及Spring WebSocket示例代码

本篇文章主要介绍了java WebSocket的实现以及Spring WebSocket,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

开始学习WebSocket,准备用它来实现一个在页面实时输出log4j的日志以及控制台的日志。

首先知道一些基础信息:

1.java7 开始支持WebSocket,并且只是做了定义,并未实现

2.tomcat7及以上,jetty 9.1及以上实现了WebSocket,其他容器没有研究

3.spring 4.0及以上增加了WebSocket的支持

4.spring 支持STOMP协议的WebSocket通信

5.WebSocket 作为java的一个扩展,它属于javax包目录下,通常需要手工引入该jar,以tomcat为例,可以在 tomcat/lib 目录下找到 websocket-api.jar

开始实现

先写一个普通的WebSocket客户端,直接引入tomcat目录下的jar,主要的jar有:websocket-api.jar、tomcat7-websocket.jar

public static void f1() { try { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); // 获取WebSocket连接器,其中具体实现可以参照websocket-api.jar的源码,Class.forName("org.apache.tomcat.websocket.WsWebSocketContainer"); String uri = "ws://localhost:8081/log/log"; Session session = container.connectToServer(Client.class, new URI(uri)); // 连接会话 session.getBasicRemote().sendText("123132132131"); // 发送文本消息 session.getBasicRemote().sendText("4564546"); } catch (Exception e) { e.printstacktrace(); } }

其中的URL格式必须是ws开头,后面接注册的WebSocket地址

Client.java 是用于收发消息

@ClientEndpoint public class Client { @Onopen public void onopen(Session session) { System.out.println("Connected to endpoint: " + session.getBasicRemote()); } @OnMessage public void onMessage(String message) { System.out.println(message); } @OnError public void onError(Throwable t) { t.printstacktrace(); } }

到这一步,客户端的收发消息已经完成,现在开始编写服务端代码,用Spring 4.0,其中pom.xml太长就不贴出来了,会用到jackson,spring-websocket,spring-message

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; import com.gionee.log.client.LogWebSocketHandler; /** * 注册普通WebScoket * @author PengBin * @date 2016年6月21日 下午5:29:00 */ @Configuration @EnableWebMvc @EnableWebSocket public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Autowired @Lazy private SimpMessagingTemplate template; /** {@inheritDoc} */ @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(logWebSocketHandler(), "/log"); // 此处与客户端的 URL 相对应 } @Bean public WebSocketHandler logWebSocketHandler() { return new LogWebSocketHandler(template); } }

import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; /** * * @author PengBin * @date 2016年6月24日 下午6:04:39 */ public class LogWebSocketHandler extends TextWebSocketHandler { private SimpMessagingTemplate template; public LogWebSocketHandler(SimpMessagingTemplate template) { this.template = template; System.out.println("初始化 handler"); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String text = message.getPayload(); // 获取提交过来的消息 System.out.println("handMessage:" + text); // template.convertAndSend("/topic/getLog", text); // 这里用于广播 session.sendMessage(message); } }

这样,一个普通的WebSocket就完成了,自己还可以集成安全控制等等

Spring还支持一种注解的方式,可以实现订阅和广播,采用STOMP格式协议,类似MQ,其实应该就是用的MQ的消息格式,下面是实现

同样客户端:

public static void main(String[] args) { try { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); String uri = "ws://localhost:8081/log/hello/hello/websocket"; Session session = container.connectToServer(Client.class, new URI(uri)); char lf = 10; // 这个是换行 char nl = 0; // 这个是消息结尾的标记,一定要 StringBuilder sb = new StringBuilder(); sb.append("SEND").append(lf); // 请求的命令策略 sb.append("destination:/app/hello").append(lf); // 请求的资源 sb.append("content-length:14").append(lf).append(lf); // 消息体的长度 sb.append("{"name":"123"}").append(nl); // 消息体 session.getBasicRemote().sendText(sb.toString()); // 发送消息 Thread.sleep(50000); // 等待一小会 session.close(); // 关闭连接 } catch (Exception e) { e.printstacktrace(); } }

这里一定要注意,换行符和结束符号,这个是STOMP协议规定的符号,错了就不能解析到

服务端配置

/** * 启用STOMP协议WebSocket配置 * @author PengBin * @date 2016年6月24日 下午5:59:42 */ @Configuration @EnableWebMvc @EnableWebSocketMessagebroker public class WebSocketbrokerConfig extends AbstractWebSocketMessagebrokerConfigurer { /** {@inheritDoc} */ @Override public void registerStompEndpoints(StompEndpointRegistry registry) { System.out.println("注册"); registry.addEndpoint("/hello").withSockJS(); // 注册端点,和普通服务端的/log一样的 // withSockJS()表示支持socktJS访问,在浏览器中使用 } /** {@inheritDoc} */ @Override public void configureMessagebroker(MessagebrokerRegistry config) { System.out.println("启动"); config.enableSimplebroker("/topic"); // config.setApplicationDestinationPrefixes("/app"); // 格式前缀 } } Controller @Controller public class LogController { private SimpMessagingTemplate template; @Autowired public LogController(SimpMessagingTemplate template) { System.out.println("init"); this.template = template; } @MessageMapping("/hello") @SendTo("/topic/greetings") // 订阅 public Greeting greeting(HelloMessage message) throws Exception { System.out.println(message.getName()); Thread.sleep(3000); // simulated delay return new Greeting("Hello, " + message.getName() + "!"); } }

到这里就已经全部完成。

template.convertAndSend("/topic/greetings", "通知"); // 这个的意思就是向订阅了/topic/greetings进行广播

对于用socktJS连接的时候会有一个访问 /info 地址的请求

如果在浏览器连接收发送消息,则用sockt.js和stomp.js

function connect() { var socket = new SockJS('/log/hello/hello'); stompClient = Stomp.over(socket); stompClient.connect({}, function(frame) { setConnected(true); console.log('Connected: ' + frame); stompClient.subscribe('/topic/greetings', function(greeting) { showGreeting(JSON.parse(greeting.body).content); }); }); } function disconnect() { if (stompClient != null) { stompClient.disconnect(); } setConnected(false); console.log("disconnected"); } function sendName() { var name = document.getElementById('name').value; stompClient.send("/app/hello", {}, JSON.stringify({ 'name' : name })); }

在浏览器中可以看到请求返回101状态码,意思就是切换协议

java – Spring websocket发送给特定的人

java – Spring websocket发送给特定的人

我为 spring-web app添加了基于自定义令牌的身份验证,并为spring websocket扩展了相同的身份验证,如下所示
public class WebSocketConfig extends AbstractWebSocketMessagebrokerConfigurer {

    @Override
    public void configureMessagebroker(MessagebrokerRegistry config) {
        config.enableSimplebroker("/topic","/queue");
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").setAllowedOrigins("*").withSockJS();
    }

    @Override
      public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.setInterceptors(new ChannelInterceptorAdapter() {

            @Override
            public Message<?> preSend(Message<?> message,MessageChannel channel) {

                StompHeaderAccessor accessor =
                    MessageHeaderAccessor.getAccessor(message,StompHeaderAccessor.class);

                if (StompCommand.CONNECT.equals(accessor.getCommand())) {
                    String jwtToken = accessor.getFirstNativeHeader("Auth-Token");
                        if (!StringUtils.isEmpty(jwtToken)) {
                            Authentication auth = tokenService.retrieveUserAuthToken(jwtToken);
                            SecurityContextHolder.getContext().setAuthentication(auth);
                            accessor.setUser(auth);
                            //for Auth-Token '12345token' the user name is 'user1' as auth.getName() returns 'user1'
                        }
                }

                return message;
            }
        });
      }
}

连接到套接字的客户端代码是

var socket = new SockJS('http://localhost:8080/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({'Auth-Token': '12345token'},function (frame) {
        stompClient.subscribe('/user/queue/greetings',function (greeting) {
            alert(greeting.body);
        });
    });

从我的控制器我发送消息为

messagingTemplate.convertAndSendToUser("user1","/queue/greetings","Hi User1");

对于auth令牌12345token,用户名是user1.但是当我向user1发送消息时,它没有在客户端收到.这有什么我想念的吗?

解决方法

在您的Websocket控制器中,您应该执行以下操作:
@Controller
public class GreetingController {

    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    @MessageMapping("/hello")
    public void greeting(Principal principal,HelloMessage message) throws  Exception {
        Greeting greeting = new Greeting();
        greeting.setContent("Hello!");
        messagingTemplate.convertAndSendToUser(message.getToUser(),"/queue/reply",greeting);
    }
}

在客户端,您的用户应订阅topic / user / queue / reply.

您还必须添加一些目标前缀:

@Configuration
@EnableWebSocketMessagebroker
public class WebSocketConfig extends AbstractWebSocketMessagebrokerConfigurer {

    @Override
    public void configureMessagebroker(MessagebrokerRegistry config) {
        config.enableSimplebroker("/topic","/queue","/user");
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }
/*...*/
}

当您的服务器在/ app / hello队列上收到消息时,它应该向您的dto中的用户发送消息.用户必须等于用户的主体.

我认为您的代码中唯一的问题是您的“/ user”不在您的目标前缀中.您的问候语消息被阻止,因为您将它们发送到以/ user开头的队列中,并且未注册此前缀.

你可以在git repo上查看来源:
https://github.com/simvetanylen/test-spring-websocket

希望它有效!

java – 使用sockjs stomp over socket无法连接Spring 4 WebSocket

java – 使用sockjs stomp over socket无法连接Spring 4 WebSocket

尝试使用sockjs在套接字上使用带有STOMP的 Spring 4 WebSocket.
我遇到了一个问题.

我的配置:

websocket.xml – spring上下文的一部分

<websocket:message-broker application-destination-prefix="/app">  
    <websocket:stomp-endpoint path="/ws">                         
        <websocket:sockjs/>                                       
    </websocket:stomp-endpoint>                                   
    <websocket:simple-broker prefix="/topic"/>                    
</websocket:message-broker>

控制器代码:

@MessageMapping("/ws")
@SendTo("/topic/ws")
public AjaxResponse hello() throws Exception {
    AjaxResponse ajaxResponse = new AjaxResponse();
    ajaxResponse.setSuccess(true);
    ajaxResponse.addSuccessMessage("WEB SOCKET!!! HELL YEAH!");
    return ajaxResponse;
}

客户端:

var socket = new SockJS("<c:url value='/ws'/>");               
var stompClient = Stomp.over(socket);                             
stompClient.connect({},function(frame) {                         
    alert('Connected: ' + frame);                                 
    stompClient.send("/app/ws",{},{});                       
    stompClient.subscribe('/topic/ws',function(response){ 
        alert(response.success);                                  
    });                                                           
});

输出:

opening Web Socket... stomp.js:130
GET http://localhost:8080/ws/info 404 (Not Found) sockjs-0.3.js:807
Whoops! Lost connection to undefined stomp.js:130

我做错了什么?

我在谷歌找到了一些例子(TickerStocks或类似的东西,问候应用程序(Spring的例子)),所有这些都给了我同样的错误.我尝试使用WebSocket与握手(没有sockjs) – 相同的结果).

补充资料:

方法public AjaxResponse hello();放在根上下文“/”的IndexController中.所以我可以提供完整的路径:http:// localhost:8080 / ws.
要部署经过测试的tomcat7和tomcat8.

解决方法

我遵循 Boris The Spider建议,我开始使用Java配置(AppConfig和WebInit文件)而不是XML配置文件.当我完成迁移 – 我尝试了websockets – 它是有效的!我认为主要的问题是WebSocket的XML配置.

关于Spring WebSocket发送给特定的人spring websocket stomp的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Java Spring测试多个发送消息WebSocket、java WebSocket的实现以及Spring WebSocket示例代码、java – Spring websocket发送给特定的人、java – 使用sockjs stomp over socket无法连接Spring 4 WebSocket的相关知识,请在本站寻找。

本文标签: