没有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等命令来执行操作。
这种工作流程甚至可能吗?我做错了什么,或者我错误地解决了整个想法和它的工作方式?
我已经解决了这个问题,所以简短的回答是是的,您可以使用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帮助和实施移动端。
你解决了这个问题吗? – sjbwylbs
我没有用Google Websocket客户端解决它,但是我使用了不使用SockJS的移动应用程序。我发布了完整的答案和更详细的说明。随意问你是否还有其他问题。 – Plebejusz