我试图用Spring boot&Stomp Protocol实现一个基本的聊天应用程序。我无法通过SimpMessagingTemplate.convertAndSendToUser
向特定用户发送消息
我的所有消息都被推送到所有连接的套接字。
我的控制器:
@Controller
public class MessageController {
private final SimpMessagingTemplate simpMessagingTemplate;
/**
* Constructor for object
*
* @param simpMessagingTemplate
*/
public MessageController(final SimpMessagingTemplate simpMessagingTemplate) {
this.simpMessagingTemplate = simpMessagingTemplate;
}
/**
* Responsible for sharing message through web socket.s
*
* @param message
* to share with audience.
* @return
*/
@MessageMapping("/message")
@SendTo("/topic/message")
public Message send(Message message) {
String time = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
message.setTime(time);
simpMessagingTemplate.convertAndSendToUser(message.getTo(), "/topic/message", message);
return message;
}
}
网络套接字配置:
@EnableWebSocketMessageBroker
@Configuration
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
private static final int MESSAGE_BUFFER_SIZE = 8192;
private static final long SECOND_IN_MILLIS = 1000L;
private static final long HOUR_IN_MILLIS = SECOND_IN_MILLIS * 60 * 60;
/*
* (non-Javadoc)
*
* @see org.springframework.web.socket.config.annotation.
* AbstractWebSocketMessageBrokerConfigurer#configureMessageBroker(org.
* springframework.messaging.simp.config.MessageBrokerRegistry)
*/
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// simple broker is applicable for first setup.
// To scale application enableStompBrokerRelay has to be configured.
// documentation :
// https://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-handle-broker-relay
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
/*
* (non-Javadoc)
*
* @see org.springframework.web.socket.config.annotation.
* WebSocketMessageBrokerConfigurer#registerStompEndpoints(org.
* springframework.web.socket.config.annotation.StompEndpointRegistry)
*/
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat");
registry.addEndpoint("/chat").withSockJS();
}
/**
* Bean for servlet container configuration. Sets message buffer size and
* idle timeout.
*
* @return
*/
@Bean
public ServletServerContainerFactoryBean createWebSocketContainer() {
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
container.setMaxTextMessageBufferSize(MESSAGE_BUFFER_SIZE);
container.setMaxBinaryMessageBufferSize(MESSAGE_BUFFER_SIZE);
container.setMaxSessionIdleTimeout(HOUR_IN_MILLIS);
container.setAsyncSendTimeout(SECOND_IN_MILLIS);
return container;
}
}
基本安全配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("1").password("1").roles("USER");
auth.inMemoryAuthentication().withUser("2").password("2").roles("USER");
auth.inMemoryAuthentication().withUser("3").password("3").roles("USER");
}
}
和javascript代码段:
dataStream = $websocket('ws://localhost:8080/chat');
stomp = Stomp.over(dataStream.socket);
var startListener = function() {
connected = true;
stomp.subscribe('/topic/message', function(data) {
messages.push(JSON.parse(data.body));
listener.notify();
});
};
stomp.connect({
'Login' : name,
passcode : name,
'client-id' : name
}, startListener);
send = function(request) {
stomp.send('/app/message', {}, JSON.stringify(request));
}
您应该订阅特殊目的地。
stomp.subscribe('/topic/message' + client_id, function(data) {
messages.push(JSON.parse(data.body));
listener.notify();
});
带有return的@SendTo(“/ topic / message”)将向所有客户端发送消息订阅“/ topic / message”,同时按照代码发送消息给所有客户端subribe为“/ topic / message / {message.getTo()} “:
simpMessagingTemplate.convertAndSendToUser(message.getTo(), "/topic/message", message);