本文将介绍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)
- Java Spring测试多个发送消息WebSocket
- java WebSocket的实现以及Spring WebSocket示例代码
- java – Spring websocket发送给特定的人
- java – 使用sockjs stomp over socket无法连接Spring 4 WebSocket
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的本教程:https://spring.io/guides/gs/messaging-stomp-websocket/。
但是,他们目前设置的测试程序仅允许一条发送消息。如果我用多条替换该发送消息,则该代码似乎只注册了第一条发送消息。您可以在this file上查看测试设置。
如何在同一测试方法上测试多条发送消息?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
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发送给特定的人
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发送消息时,它没有在客户端收到.这有什么我想念的吗?
解决方法
@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
我遇到了一个问题.
我的配置:
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.
解决方法
关于Spring WebSocket发送给特定的人和spring websocket stomp的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Java Spring测试多个发送消息WebSocket、java WebSocket的实现以及Spring WebSocket示例代码、java – Spring websocket发送给特定的人、java – 使用sockjs stomp over socket无法连接Spring 4 WebSocket的相关知识,请在本站寻找。
本文标签: