Example usage for org.springframework.web.socket WebSocketSession sendMessage

List of usage examples for org.springframework.web.socket WebSocketSession sendMessage

Introduction

In this page you can find the example usage for org.springframework.web.socket WebSocketSession sendMessage.

Prototype

void sendMessage(WebSocketMessage<?> message) throws IOException;

Source Link

Document

Send a WebSocket message: either TextMessage or BinaryMessage .

Usage

From source file:org.springframework.messaging.simp.stomp.StompProtocolHandler.java

protected void sendErrorMessage(WebSocketSession session, Throwable error) {

    StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.ERROR);
    headers.setMessage(error.getMessage());
    Message<?> message = MessageBuilder.withPayloadAndHeaders(new byte[0], headers).build();
    byte[] bytes = this.stompMessageConverter.fromMessage(message);
    try {//  w ww  . j  a  v  a2  s  .  c  om
        session.sendMessage(new TextMessage(new String(bytes, Charset.forName("UTF-8"))));
    } catch (Throwable t) {
        // ignore
    }
}

From source file:org.springframework.messaging.simp.stomp.StompWebSocketHandler.java

protected void handleConnect(WebSocketSession session, Message<?> message) throws IOException {

    StompHeaderAccessor connectHeaders = StompHeaderAccessor.wrap(message);
    StompHeaderAccessor connectedHeaders = StompHeaderAccessor.create(StompCommand.CONNECTED);

    Set<String> acceptVersions = connectHeaders.getAcceptVersion();
    if (acceptVersions.contains("1.2")) {
        connectedHeaders.setAcceptVersion("1.2");
    } else if (acceptVersions.contains("1.1")) {
        connectedHeaders.setAcceptVersion("1.1");
    } else if (acceptVersions.isEmpty()) {
        // 1.0/*from w  w  w.  j  a v a 2  s  .  c  om*/
    } else {
        throw new StompConversionException("Unsupported version '" + acceptVersions + "'");
    }
    connectedHeaders.setHeartbeat(0, 0); // TODO

    Principal principal = session.getPrincipal();
    if (principal != null) {
        connectedHeaders.setNativeHeader(CONNECTED_USER_HEADER, principal.getName());
        connectedHeaders.setNativeHeader(QUEUE_SUFFIX_HEADER, session.getId());

        if (this.queueSuffixResolver != null) {
            String suffix = session.getId();
            this.queueSuffixResolver.addQueueSuffix(principal.getName(), session.getId(), suffix);
        }
    }

    // TODO: security

    Message<?> connectedMessage = MessageBuilder.withPayloadAndHeaders(new byte[0], connectedHeaders).build();
    byte[] bytes = this.stompMessageConverter.fromMessage(connectedMessage);
    session.sendMessage(new TextMessage(new String(bytes, Charset.forName("UTF-8"))));
}

From source file:org.springframework.messaging.simp.stomp.StompWebSocketHandler.java

/**
 * Handle STOMP messages going back out to WebSocket clients.
 *///from w w  w .j a v  a  2 s. c  o  m
@Override
public void handleMessage(Message<?> message) {

    StompHeaderAccessor headers = StompHeaderAccessor.wrap(message);
    headers.setCommandIfNotSet(StompCommand.MESSAGE);

    if (StompCommand.CONNECTED.equals(headers.getCommand())) {
        // Ignore for now since we already sent it
        return;
    }

    String sessionId = headers.getSessionId();
    if (sessionId == null) {
        // TODO: failed message delivery mechanism
        logger.error("Ignoring message, no sessionId header: " + message);
        return;
    }

    WebSocketSession session = this.sessions.get(sessionId);
    if (session == null) {
        // TODO: failed message delivery mechanism
        logger.error("Ignoring message, sessionId not found: " + message);
        return;
    }

    if (StompCommand.MESSAGE.equals(headers.getCommand()) && (headers.getSubscriptionId() == null)) {
        // TODO: failed message delivery mechanism
        logger.error("Ignoring message, no subscriptionId header: " + message);
        return;
    }

    if (!(message.getPayload() instanceof byte[])) {
        // TODO: failed message delivery mechanism
        logger.error("Ignoring message, expected byte[] content: " + message);
        return;
    }

    try {
        message = MessageBuilder.withPayloadAndHeaders(message.getPayload(), headers).build();
        byte[] bytes = this.stompMessageConverter.fromMessage(message);
        session.sendMessage(new TextMessage(new String(bytes, Charset.forName("UTF-8"))));
    } catch (Throwable t) {
        sendErrorMessage(session, t);
    } finally {
        if (StompCommand.ERROR.equals(headers.getCommand())) {
            try {
                session.close(CloseStatus.PROTOCOL_ERROR);
            } catch (IOException e) {
            }
        }
    }
}

From source file:org.springframework.web.socket.messaging.StompSubProtocolHandler.java

/**
 * Invoked when no//from   ww  w  .  j a  v  a  2s  .com
 * {@link #setErrorHandler(StompSubProtocolErrorHandler) errorHandler}
 * is configured to send an ERROR frame to the client.
 */
private void sendErrorMessage(WebSocketSession session, Throwable error) {
    StompHeaderAccessor headerAccessor = StompHeaderAccessor.create(StompCommand.ERROR);
    headerAccessor.setMessage(error.getMessage());

    byte[] bytes = this.stompEncoder.encode(headerAccessor.getMessageHeaders(), EMPTY_PAYLOAD);
    try {
        session.sendMessage(new TextMessage(bytes));
    } catch (Throwable ex) {
        // Could be part of normal workflow (e.g. browser tab closed)
        logger.debug("Failed to send STOMP ERROR to client", ex);
    }
}

From source file:org.springframework.web.socket.messaging.StompSubProtocolHandler.java

private void sendToClient(WebSocketSession session, StompHeaderAccessor stompAccessor, byte[] payload) {
    StompCommand command = stompAccessor.getCommand();
    try {//  w  w w.  j  a v  a2  s. c o m
        byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), payload);
        boolean useBinary = (payload.length > 0 && !(session instanceof SockJsSession)
                && MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(stompAccessor.getContentType()));
        if (useBinary) {
            session.sendMessage(new BinaryMessage(bytes));
        } else {
            session.sendMessage(new TextMessage(bytes));
        }
    } catch (SessionLimitExceededException ex) {
        // Bad session, just get out
        throw ex;
    } catch (Throwable ex) {
        // Could be part of normal workflow (e.g. browser tab closed)
        if (logger.isDebugEnabled()) {
            logger.debug("Failed to send WebSocket message to client in session " + session.getId(), ex);
        }
        command = StompCommand.ERROR;
    } finally {
        if (StompCommand.ERROR.equals(command)) {
            try {
                session.close(CloseStatus.PROTOCOL_ERROR);
            } catch (IOException ex) {
                // Ignore
            }
        }
    }
}

From source file:org.springframework.web.socket.sockjs.client.AbstractSockJsIntegrationTests.java

@Test
public void fallbackAfterTransportFailure() throws Exception {
    this.testFilter.sendErrorMap.put("/websocket", 200);
    this.testFilter.sendErrorMap.put("/xhr_streaming", 500);
    TestClientHandler handler = new TestClientHandler();
    initSockJsClient(createWebSocketTransport(), createXhrTransport());
    WebSocketSession session = this.sockJsClient.doHandshake(handler, this.baseUrl + "/echo").get();
    assertEquals("Fallback didn't occur", XhrClientSockJsSession.class, session.getClass());
    TextMessage message = new TextMessage("message1");
    session.sendMessage(message);
    handler.awaitMessage(message, 5000);
}

From source file:org.springframework.web.socket.sockjs.client.AbstractSockJsIntegrationTests.java

@Test(timeout = 5000)
public void fallbackAfterConnectTimeout() throws Exception {
    TestClientHandler clientHandler = new TestClientHandler();
    this.testFilter.sleepDelayMap.put("/xhr_streaming", 10000L);
    this.testFilter.sendErrorMap.put("/xhr_streaming", 503);
    initSockJsClient(createXhrTransport());
    this.sockJsClient.setConnectTimeoutScheduler(this.wac.getBean(ThreadPoolTaskScheduler.class));
    WebSocketSession clientSession = sockJsClient.doHandshake(clientHandler, this.baseUrl + "/echo").get();
    assertEquals("Fallback didn't occur", XhrClientSockJsSession.class, clientSession.getClass());
    TextMessage message = new TextMessage("message1");
    clientSession.sendMessage(message);
    clientHandler.awaitMessage(message, 5000);
    clientSession.close();/*  www  .  ja  v  a 2s.com*/
}

From source file:org.springframework.web.socket.sockjs.client.AbstractSockJsIntegrationTests.java

private void testEcho(int messageCount, Transport transport, WebSocketHttpHeaders headers) throws Exception {
    List<TextMessage> messages = new ArrayList<>();
    for (int i = 0; i < messageCount; i++) {
        messages.add(new TextMessage("m" + i));
    }/* ww  w  .  ja  va  2s.  c o m*/
    TestClientHandler handler = new TestClientHandler();
    initSockJsClient(transport);
    URI url = new URI(this.baseUrl + "/echo");
    WebSocketSession session = this.sockJsClient.doHandshake(handler, headers, url).get();
    for (TextMessage message : messages) {
        session.sendMessage(message);
    }
    handler.awaitMessageCount(messageCount, 5000);
    for (TextMessage message : messages) {
        assertTrue("Message not received: " + message, handler.receivedMessages.remove(message));
    }
    assertEquals("Remaining messages: " + handler.receivedMessages, 0, handler.receivedMessages.size());
    session.close();
}