我有支持的Spring服务器。我希望使用STOMP子协议来处理web套接字上的通信,因此STOMP端点的配置如下所示:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat")
.setAllowedOrigins("*")
.withSockJS();
}
}Spring文档以及我能够找到的关于这个主题的任何资源都演示了如何使用SockJS + StompJS创建STOMP客户端。它可以工作,但据我所知,根本不应该需要它,因为STOMP只是一个子协议,我应该能够通过使用STOMP消息语法与我的服务器进行基本的通信。
假设我只想通过Google简单的Web套接字客户端插件连接到我的STOMP服务器。因此,对于STOMP规范,我做的第一件事就是打开web套接字连接。我用它做的
ws://my.server.here/chat/websocket
链接。这一部分起作用了,我的联系建立了。现在我想用STOMP。同样,正如STOMP规范所述,我现在应该发送CONNECT命令,如下所示(STOP1.1):
CONNECT
accept-version:1.0,1.1
host:my.host.here
^@然后,我会期望得到服务器的响应与连接的命令,但我什么也没有。如果我将使用一些不存在的命令,比如"WRONG_COMMAND“,而不是"CONNECT”,那么我可以看到Spring被抛出了未知的命令,所以我假设我的消息会击中Spring的Websocket内部,但是我无法得到任何返回。如果这是可行的,我想使用后续的发送,订阅等命令来执行操作。
这种工作流程可能吗?我是做错了什么,还是错误地让整个想法和它的运作方式令人失望?
发布于 2017-08-30 09:30:59
我已经解决了这个问题,所以简单的回答是是的,您可以不用SockJS使用Spring的STOMP消息,只需向websocket端点发送适当构造的消息即可。
更长的答案是,我无法使用客户端完成此操作,因为^@字符来自STOMP语法,引用了STOM文档:
本文档中的示例将使用ASCII中的^@、control-@来表示空八进制。
Google的Websocket客户端的问题是,正如我想的那样,我不能用它发送这个空的八进制,所以我的STOMP消息没有被正确终止。
我需要它为不能使用SockJS的移动应用程序提供简单的聊天,并且在我的公司移动开发人员的帮助下,我们能够编写工作解决方案,这基本上只是一个与STOMP子协议兼容的消息格式化程序。
我们使用Xamarin和C#一起开发移动应用程序。连接到脚是这样做的。请注意,我们首先打开到websocket的常规连接,并在建立websocket时进行STOMP处理:
var connectString = String.Format("CONNECT\naccept-version:1.0,1.1\nlogin:{0}\nheart-beat:30000,0\n\n\0", AuthService.TOKEN);
webSocketConnection = Websockets.WebSocketFactory.Create();
webSocketConnection.OnOpened += () =>
{
webSocketConnection.Send(connectString);
Debug.WriteLine("opened");
};您必须使用客户端onMessage方法来处理来自服务器的响应,否则它是等效的。建立连接后,您可以发送像这样的STOMP消息,例如,我们在应用程序中这样做:
var messageString = String.Format("SEND\ndestination:/app/chat/send/{0}\nlogin:{1}\n\n{{\"message\":\"{2}\"}}\n\0", chatName, AuthService.TOKEN, message);
webSocketConnection.Send(messageString);还请记住,您可能需要支持心跳,这样后端端不会断开您的应用程序,以为它已经死了。在我们的移动应用程序中,我们从另一个线程发送心跳。心跳只是发送到websocket地址的换行符。注意,它不包含任何STOMP、标头等:
webSocketConnection.Send("\n");我们使用这作为websocket客户端。
这只是我们完全支持在没有SockJS的情况下与Spring的Websockets连接的基础,如果您有进一步的问题,请随时询问。支持马特乌斯·加夫克帮助和实现移动端。
https://stackoverflow.com/questions/43522327
复制相似问题