首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有SockJS/StompJS的Spring STOMP服务器

没有SockJS/StompJS的Spring STOMP服务器
EN

Stack Overflow用户
提问于 2017-04-20 14:26:36
回答 1查看 3.2K关注 0票数 6

我有支持的Spring服务器。我希望使用STOMP子协议来处理web套接字上的通信,因此STOMP端点的配置如下所示:

代码语言:javascript
复制
@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):

代码语言:javascript
复制
CONNECT
accept-version:1.0,1.1
host:my.host.here

^@

然后,我会期望得到服务器的响应与连接的命令,但我什么也没有。如果我将使用一些不存在的命令,比如"WRONG_COMMAND“,而不是"CONNECT”,那么我可以看到Spring被抛出了未知的命令,所以我假设我的消息会击中Spring的Websocket内部,但是我无法得到任何返回。如果这是可行的,我想使用后续的发送,订阅等命令来执行操作。

这种工作流程可能吗?我是做错了什么,还是错误地让整个想法和它的运作方式令人失望?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-30 09:30:59

我已经解决了这个问题,所以简单的回答是是的,您可以不用SockJS使用Spring的STOMP消息,只需向websocket端点发送适当构造的消息即可。

更长的答案是,我无法使用客户端完成此操作,因为^@字符来自STOMP语法,引用了STOM文档:

本文档中的示例将使用ASCII中的^@、control-@来表示空八进制。

Google的Websocket客户端的问题是,正如我想的那样,我不能用它发送这个空的八进制,所以我的STOMP消息没有被正确终止。

我需要它为不能使用SockJS的移动应用程序提供简单的聊天,并且在我的公司移动开发人员的帮助下,我们能够编写工作解决方案,这基本上只是一个与STOMP子协议兼容的消息格式化程序。

我们使用Xamarin和C#一起开发移动应用程序。连接到脚是这样做的。请注意,我们首先打开到websocket的常规连接,并在建立websocket时进行STOMP处理:

代码语言:javascript
复制
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消息,例如,我们在应用程序中这样做:

代码语言:javascript
复制
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、标头等:

代码语言:javascript
复制
webSocketConnection.Send("\n");

我们使用作为websocket客户端。

这只是我们完全支持在没有SockJS的情况下与Spring的Websockets连接的基础,如果您有进一步的问题,请随时询问。支持马特乌斯·加夫克帮助和实现移动端。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43522327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档