没有SockJS/StompJS的Spring STOMP服务器

问题描述:

我有支持Spring Websocket的Spring服务器。我想用STOMP子协议来处理在网络套接字通信,所以STOMP端点的配置看起来如下:没有SockJS/StompJS的Spring 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消息语法基本上从任何Web套接字客户端与我的服务器进行通信。

假设我只是想从Google Chrome简单网络套接字客户端插件连接到我的STOMP服务器。根据STOMP规范,我所做的第一件事是打开网络套接字连接。我

WS做到这一点://my.server.here/chat/websocket

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

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

^@ 

然后,我希望从与所连接的命令服务器的响应,但我什么也没得到。如果不是“CONNECT”,我会使用一些不存在的命令,比如“WRONG_COMMAND”,那么我可以看到有关未知命令的Spring异常,所以我想我的消息触及Spring的Websocket内部,但我无法得到任何回报。如果这可行,我希望使用后续的SEND,SUBSCRIBE等命令来执行操作。

这种工作流程甚至可能吗?我做错了什么,或者我错误地解决了整个想法和它的工作方式?

+0

你解决了这个问题吗? – sjbwylbs

+0

我没有用Google Websocket客户端解决它,但是我使用了不使用SockJS的移动应用程序。我发布了完整的答案和更详细的说明。随意问你是否还有其他问题。 – Plebejusz

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

较长的回答是,我无法与谷歌简单的WebSocket客户端要做到这一点,从STOMP语法手段^@人物,从STOM文档引用:本文档中

例子都将使用^ @,控制 - ASCII中的@表示NULL八位字节。

谷歌的Websocket客户端的问题是,我认为,我真的不能发送这个空的八位字节,所以我的STOMP消息没有正确终止。

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

我们将Xamarin与C#用于移动应用程序开发。连接到STOMP就是这样完成的。请注意,我们首先打开到WebSocket的定期联系,我们去蹬处理时,它的建立:

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"); 

我们使用this作为我们的WebSocket客户端。

这只是基于此,我们建立了完全支持连接与Spring的Websockets没有SockJS,随时问如果你有进一步的问题。积分Mateusz Gaffke帮助和实施移动端。