在spring文档之后,我能够通过WebSockets通过STOMP发送和接收JSON。然而,在高速率下性能很差,因此我希望分析二进制消息的使用。
我使用带有必要代理中继的SimpMessageTemplate发送消息-请参阅Spring留档
@Controller
public class DemoBinaryController {
@Autowired
private SimpMessagingtemplate template
@Scheduled(fixedDelay = 5000)
public void demo() throws Exception {
GenericMessage<byte[]> message = new GenericMessage<byte[]>(new byte[]{65,66,67});
template.send("/app/binarydemo", message);
}
}
JavaScript客户端使用stomp接收数据。js使用标准机制。
var subscription = client.subscribe("/app/binarydemo", new function(message) {
console.log("RX message", typeof message.body, message.body.length);
});
消息以字符串形式接收,控制台输出如下。我在期待一些原始类型,比如ArrayBuffer
RX message string 3
RX message string 3
我意识到STOMP中的T代表文本,然而Spring文档暗示二进制消息至少在普通websocket中是可能的,STOMP规范也指出了这一点
STOMP是基于文本的,但也允许传输二进制消息。
更新:我在服务器端做了更多的调试。似乎org.springframework.web.socket.TextMessage总是在org.springframework.web.socket.messaging.StompSubPro colHandler中使用,而不是org.springframework.web.socket.BinaryMessage。我已经为这个SPR-12301提出了一个功能请求
message = MessageBuilder.withPayload(message.getPayload()).setHeaders(headers).build();
byte[] bytes = this.stompEncoder.encode((Message<byte[]>) message);
synchronized(session) {
session.sendMessage(new TextMessage(new String(bytes, UTF8_CHARSET)));
}
尝试仅使用ByteArrayMessageConverter
配置您的服务器:
@Configuration
@EnableWebSocketMessageBroker
public class MyWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
messageConverters.add(new ByteArrayMessageConverter());
return false;
}
}
更新
啊!我明白了。谢谢:
public TextMessage(byte[] payload) {
super(new String(payload, UTF_8));
this.bytes = payload;
}
从STOMP规范的另一侧:
STOMP消息的正文必须是字符串。如果要发送和接收JSON对象。。。
根据ArrayBuffer:
从存量数据获取数组缓冲区
所以,我认为你没有一个方法,而不是为你提供一些自定义的MessageConverter
,它将你的byte[]
转换为Base64 String并发送它。
在JavaScript方面,您应该以某种方式将该字符串解码为ArrayBuffer
。
似乎是组织。springframework。网状物插座TextMessage始终在组织内使用。springframework。网状物插座消息传递。stompsubtocolhandler而不是org。springframework。网状物插座二进制消息。我已经为SPR-12301提出了一个功能请求,该请求已被接受。
message = MessageBuilder.withPayload(message.getPayload()).setHeaders(headers).build();
byte[] bytes = this.stompEncoder.encode((Message<byte[]>) message);
synchronized(session) {
session.sendMessage(new TextMessage(new String(bytes, UTF8_CHARSET)));
}
使现代化
我正在开发一个查看器应用程序,其中服务器捕获图像,执行一些图像处理操作,这需要在客户端显示在HTML5画布上。我写的服务器是在VC和使用http://www.codeproject.com/Articles/371188/A-Cplusplus-Websocket-server-for-realtime-interact. 到目前为止,我已经实现了所需的功能。现在我需要做的就是优化。引用是一个用来
我正在开发一个应用程序,用户必须从列表中选择任意数量的国家,我必须通过多部分发送所选的名称。 但是,在所有的尝试中,我都得到了错误retrofit.retrofiterror:Part body不能为null。 我还提到,ChangeLog for refitfit提到“new:Support iterable and array参数使用OKHTTP的”,但是经过深入研究,我发现给定的示例相当混乱
问题内容: 我正在尝试将HTTP POST发送到网络上的设备。不幸的是,我想将四个特定字节的数据发送到设备,但我似乎只能将字符串发送到设备。反正有使用JavaScript发送原始二进制文件吗? 这是我用来执行POST的脚本,除非我在数据字段中输入字符串,否则它目前不会运行。有任何想法吗? 问题答案: 默认情况下,jQuery序列化数据(传递的属性)-这意味着将 数字 作为“ 4244668417”
我正在使用Spring webSocket(STOMP作为子协议)和Sockjs开发一个消息应用程序。 我应该提供支持在消息中发送文件。 根据这张票证,sockjs不支持二进制数据,但STOMP支持。 我知道我们可以将图像转换为base64并通过stomp发送,但我认为这不是最佳做法,因为转换和开销很大。我还必须保存消息,所以要在服务器上再次保存这个base64编码的文件,我必须对它们进行解码。
问题内容: 我已经看到了许多在Java中通过套接字发送序列化数据的示例,但是我想要的只是发送一些简单的整数和字符串。而且,问题是我正在尝试将这些信息传递给用C编写的二进制文件。 因此,最重要的是:如何在Java中通过套接字发送一些字节? 问题答案: 我真的建议不要直接使用Java Sockets库。我发现Netty(来自JBoss)非常易于实现且功能强大。Netty ChannelBuffer类带
我使用Spring的STOMP over WebSocket实现与一个全功能的ActiveMQ代理。当用户向主题订阅时,在成功订阅之前必须通过一些权限逻辑。我使用ChannelInterceptor应用权限逻辑,如下所示: WebSocketConfig。爪哇: WebSocketSecurityConfig.java: MySubscriptionInterceptor。爪哇: 当没有足够权限的