6

尝试使用 sockjs 在套接字上使用 Spring 4 WebSocket 和 STOMP。我遇到了一个问题。

我的配置:

websocket.xml - spring 上下文的一部分

<websocket:message-broker application-destination-prefix="/app">  
    <websocket:stomp-endpoint path="/ws">                         
        <websocket:sockjs/>                                       
    </websocket:stomp-endpoint>                                   
    <websocket:simple-broker prefix="/topic"/>                    
</websocket:message-broker>       

控制器代码:

@MessageMapping("/ws")
@SendTo("/topic/ws")
public AjaxResponse hello() throws Exception {
    AjaxResponse ajaxResponse = new AjaxResponse();
    ajaxResponse.setSuccess(true);
    ajaxResponse.addSuccessMessage("WEB SOCKET!!! HELL YEAH!");
    return ajaxResponse;
}

客户端:

var socket = new SockJS("<c:url value='/ws'/>");               
var stompClient = Stomp.over(socket);                             
stompClient.connect({}, function(frame) {                         
    alert('Connected: ' + frame);                                 
    stompClient.send("/app/ws", {}, {});                       
    stompClient.subscribe('/topic/ws', function(response){ 
        alert(response.success);                                  
    });                                                           
});                                                               

输出:

Opening Web Socket... stomp.js:130
GET http://localhost:8080/ws/info 404 (Not Found) sockjs-0.3.js:807
Whoops! Lost connection to undefined stomp.js:130

我做错了什么?

我在 google 中找到了示例(TickerStocks 或类似的东西,问候应用程序(Spring 的示例)),所有这些都给了我同样的错误。我尝试使用带有握手的 WebSocket(没有 sockjs) - 结果相同)。

补充资料:

方法public AjaxResponse hello();放置在根上下文“/”上的 IndexController 中。所以我可以提供完整的路径:http://localhost:8080/ws。部署经过测试的tomcat7和tomcat8。

4

4 回答 4

3

我遵循Boris The Spider 的建议,开始使用 Java 配置(AppConfig 和 WebInit 文件)而不是 XML 配置文件。当我完成迁移时 - 我尝试了 websockets - 它有效!我认为主要问题在于 WebSocket 的 XML 配置。

于 2014-04-18T18:24:39.150 回答
0

我认为您的问题可能与问题相同,并且可以应用其接受的答案。

简而言之:检查您如何映射 DispatcherServlet。要使您的端点 URL 成为http://localhost:8080/wsDispatcherServlet ,并且您的应用程序上下文根应设置为“/”。

它应该是这样的,在你的web.xml

<servlet>
  <servlet-name>WebSocketDispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
  <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
  <servlet-name>WebSocketDispatcher</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

这或者您需要在端点 URL 中包含上下文根和调度程序映射:

http://<server>:<port>/<context-root>/<dispatcher-mapping>/ws

我希望它可以帮助你。

问候。

海伦诺

于 2014-04-15T14:04:08.647 回答
0

首先,您已经使用 app 设置了目标前缀,因此您必须将“app”添加到您的请求网址中。例如,如果我想请求'/ws',我应该创建带有路径'/server/app/ws' 的SockJS,你也可以编码 var socket = new SockJS("<c:url value='/server/app/ws'/>")并且你知道'server' 是你在springmvc 上的项目名称。

其次,必须在 org.springframework.web.servlet.DispatcherServlet 中添加路径 '/app/*',以免前缀为 '/app' 的路径被 web.xml 中定义的拦截器拦截。

于 2016-07-15T00:58:33.367 回答
0

我到达了这个页面 - 感谢Boris Accepted Answer 有动力重新考虑 java 方法,而不是导致 - /info=34424 出现 404 错误的 xml 方法......哎呀失去了连接 - 我的 Spring 4.2 在我的项目和许多 SockJS Stomp 实现通常可以很好地与 Spring Boot 实现配合使用。Baeldung 的这个实现有效(对我来说,没有从 Spring 4.2 更改为 5 或 Boot)。在使用他博客中提到的依赖项后,它仍然给我ClassNotFoundError。我添加了以下依赖项来修复它。

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>

奇怪的是,Baeldung 的实现没有进行任何此类调用

flow/websocket/add/info?t=1540813753999

它的作用(发送和接收)如下。我只是粘贴它,以防精通这些库的人可以在这个论坛上进一步添加见解。

 >>> SEND
destination:/app/chat
content-length:38

{"from":"nicholas","text":"try again"}

<<< MESSAGE
destination:/topic/messages
content-type:application/json;charset=UTF-8
subscription:sub-0
message-id:m3p096zk-11
content-length:53

{"from":"nicholas","text":"try again","time":"13:46"}
于 2019-09-30T04:37:45.420 回答