当前位置: 首页 > 知识库问答 >
问题:

从java WebSocketStompClient发送BinaryMessage

彭朝
2023-03-14

按照(是否可以使用Spring-WebSockets通过WebSockets发送带有STOMP的二进制数据?)看来应该可以通过WebSockets发送带有STOMP的二进制消息。

我对WebSocketStompClient进行了如下配置:

List<Transport> transports = new ArrayList<>(1);
transports.add(new WebSocketTransport( new StandardWebSocketClient()) );
WebSocketClient transport = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(transport);
// using a custom converter to serialize java object to byte[]
stompClient.setMessageConverter( new SerializedJavaObjectMessageConverter() );

我正在使用以下内容发送消息:

StompHeaders stompHeaders = new StompHeaders();
stompHeaders.setDestination( "/app/greetings");
stompHeaders.setContentType( MimeTypeUtils.APPLICATION_OCTET_STREAM );
session.send(stompHeaders, new Greeting( message ));

我收到以下断言的异常:

Assert.isInstanceOf(TextMessage.class, message, this + " supports text messages only.");

在org.springframework.web.socket.sockjs.client.abstractclientsockjs(下面)中找到,它似乎只支持TextMessage:

@Override
public final void sendMessage(WebSocketMessage<?> message) throws IOException {
    Assert.state(State.OPEN.equals(this.state), this + " is not open, current state=" + this.state);
    Assert.isInstanceOf(TextMessage.class, message, this + " supports text messages only.");
    String payload = ((TextMessage) message).getPayload();
    payload = getMessageCodec().encode(new String[] { payload });
    payload = payload.substring(1); // the client-side doesn't need message framing (letter "a")
    message = new TextMessage(payload);
    if (logger.isTraceEnabled()) {
            logger.trace("Sending message " + message + " in " + this);
    }
    sendInternal((TextMessage) message);
}

以下客户端配置正常工作:

WebSocketClient transport = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(transport)

共有1个答案

薛承志
2023-03-14

我可以通过发送一条短信来实现这个功能。我创建了另一个自定义MessageConverter,Base64编码/解码序列化对象:

public class Base64JavaObjectMessageConverter extends AbstractMessageConverter {

    public Base64JavaObjectMessageConverter() {
        super(MimeTypeUtils.TEXT_PLAIN);
    }

    @Override
    protected boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    public Object convertFromInternal(Message<?> message, Class<?> targetClass) {
        byte[] messageBytes = Base64.getDecoder().decode( (byte[])message.getPayload() );
        return SerializationUtils.deserialize( messageBytes  );
    }

    @Override
    public Object convertToInternal(Object payload, MessageHeaders headers) {
        byte[] messageBytes = SerializationUtils.serialize( payload );
        return Base64.getEncoder().encode( messageBytes);
    }

}
 类似资料:
  • 我正在写一个iOS的应用程序,使用laravel的API和谷歌Firebase的推送通知。当我使用Firebase云消息传递发送消息推送时,它会进入我的设备。当我使用laravel发送推送通知时,它不会影响。这里是我的脚本发送推送通知laravel: 它返回一个成功的结果,但通知未发送到iOS设备。 PS:它可以在Android设备上成功运行。

  • 问题内容: 用Java发送和接收邮件的最简单方法是什么。 问题答案: 不要忘记Jakarta Commons Email 发送邮件。它具有非常易于使用的API。

  • 我正在开发firebase web应用程序。我需要通过我的网络应用发送电子邮件。我看了一些教程,找到了一些代码。使用上述代码,我可以发送电子邮件。它在端口9091中运行。当地址栏上有www.mywebsite时,将发送此消息。com/sendMail。但是,当我将此页面托管到Firebase时,此代码中要做哪些更改,端口号是否必须更改?。请帮助在我的web应用程序中实现此代码。

  • 我正在尝试发送添加了标题的JSON格式。csv格式到前端进行下载。在发送HTTP响应时,我遇到了一个“不是JSON可序列化的”错误。 我的 文件: 打印响应cmd正在打印: 但是,最后一行会抛出如下错误:

  • 我已在中创建了我的应用程序并配置为云消息传递。当我从控制台发送通知时,设备会收到通知,但如果我尝试通过Rest API(使用PostMan)发送。然后通知不会到达设备,但响应显示为成功。 这是我的邮差请求 URI-https://fcm.googleapis.com/fcm/send 标题:内容类型:应用程序/json授权:密钥=MY_SERVER_KEY 正文:{“数据”:{“标题”:“火力基地

  • 问题内容: 我知道在此之前已经问过很多类似的问题,但是我认为这个问题有些不同:) 我正在编写一个maven报告插件,它将向用户列表发送电子邮件。我现在遇到的问题是,当我使用java5运行该代码时,该代码似乎运行良好,但使用java6失败。实际上,该插件是用Groovy编写的,并使用commons-email实用程序发送html消息: 该项目依赖于javax.mail:mail:1.4.1和java