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

没有SockJS/StompJS的Spring STOMP服务器

孙明德
2023-03-14

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

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat")
                .setAllowedOrigins("*")
                .withSockJS();
    }
}

Spring文档和我能找到的关于这个主题的基本资源展示了如何使用SockJS StompJS创建STOMP客户端。它可以工作,但据我所知,根本不需要它——因为STOMP只是一个子协议,我应该能够通过使用STOMP消息语法,基本上从任何web套接字客户端与服务器通信。

假设我只想从Google Chrome Simple Web Socket客户端插件连接到我的STOMP服务器。根据STOMP规范,我要做的第一件事就是打开web套接字连接。我是和你一起做的

ws://my.server.here/chat/websocket

链接。这部分工作和我的连接建立。现在我想使用STOMP。正如STOMP规范所说,我现在应该发送CONNECT命令,如下所示(STOMP 1.1):

CONNECT
accept-version:1.0,1.1
host:my.host.here

^@

然后,我希望服务器用CONNECTED命令响应,但我什么也没得到。如果我将使用一些不存在的命令,如“WRONG_COMMAND”,而不是“连接”,那么我可以看到Spring异常被抛出关于未知命令,所以我假设我的消息击中了Spring的WebSocket内部,但我无法得到任何回报。如果这将工作,我想使用后续的SEND,SUBSCRIBE等命令来执行操作。

这种工作流程可能吗?是我做错了什么,还是我错误地放弃了整个想法及其运作方式?

共有1个答案

阚吕恭
2023-03-14

我已经解决了这个问题,所以简短的回答是肯定的,您可以使用Spring的STOMP消息而不使用SockJS,只需将适当构造的消息发送到websocketendpoint。

更详细的回答是,我无法使用Google Simple Websocket客户端实现这一点,因为STOMP语法中的^@字符表示,引用STOM文档:

本文档中的示例将在ASCII中使用^@、Control-@来表示NULL八位字节。

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

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

我们将Xamarin与C#一起用于移动应用程序开发。连接到STOMP是这样完成的。请注意,我们首先打开到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);

还要记住,你可能需要支持心跳,所以后端不会断开你的应用程序,认为它已经死了。在我们的移动应用程序中,我们从另一个线程发送心跳。心跳只是一个换行meassage发送到网络套接字地址。请注意,它不包含任何STOMP标头等:

webSocketConnection.Send("\n");

我们将其用作websocket客户端。

这只是我们建立在没有SockJS的完全支持与Spring的网络套接字连接的基础上,如果您有进一步的问题,请随时询问。感谢Mateusz Gaffke帮助和实施移动端。

 类似资料:
  • 我有一个带sokjs套接字的节点应用程序。 一些HTML/JS客户端使用stomp over sock JS,但我不明白订阅是如何工作的: 客户端已连接,事件已记录,但范围为$scope。从不打电话通知。如何配置主题订阅? 编辑: 请注意,我一定清楚。 我使用sockjs模块作为websocket服务器。 没有太多的配置:

  • 我有一个简单的spring boot应用程序,它从JMS队列中获取消息,并将一些数据保存到日志文件中,但不需要web服务器。有没有办法在没有web服务器的情况下启动spring boot?

  • 问题内容: 我在没有选择器的情况下在Kubernetes的服务中苦苦挣扎。群集通过kops安装在AWS上。我有一个带有3个Nginx Pod的部署,暴露了端口80: 创建部署后,我记下了IP地址: 并创建了一个服务于IP地址的服务: 服务已成功创建: 不幸的是,我尝试通过服务从相同名称空间的另一个Pod连接到Nginx失败: 我可以直接成功地连接到Nginx Pod: 我注意到我的服务没有任何端点

  • 我需要了解在我的项目范围内使用autheorizaion服务器的便利性。 我们正在实现我们的服务并将其部署到客户环境中。 客户基础结构已经提供了一种身份验证机制,以便对用户进行身份验证。 此机制拦截所有通信并将用户重定向到“登录”表单。 之后,用户被重定向到我们的服务,我们必须处理和消化它,并使用JWT令牌进行响应。 这是我感到迷茫的地方: 我在想: 使用Spring oauth2 向授权服务器请

  • 问题内容: 我正在运行一个Java应用程序,我们将其作为服务器端系统进行分发。我正在尝试编写启动器(这里的“写”有点夸张,我基本上只是复制Java.exe文件,以便我们可以在Windows的进程浏览器中获得所需的名称)。该exe位于应用程序文件树的bin /目录中。 现在,我们在文件树中还有一个jre /目录,这是Java.exe实际所在的位置(我们将产品与Java环境一起交付)。当我使用Java

  • 我正在尝试使用spring-integration-kafka-2.1.0。在我公司的项目中发布。但是,由于下面列出的例外情况,它不起作用:org。springframework。信息。MessageDeliveryException:Dispatcher没有频道“org”的订户。springframework。网状物上下文WebApplicationContext:/order。“奥Kafka”