2015-03-25 139 views
2

最近几天我一直在尝试春季4 websocket。但有一个问题 我使用apache-tomcat-8,这不是一个maven项目。哎呀!失去连接到未定义 - 连接丢失后连接建立

这里是我的片断

的index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> 
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> 
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <title>Hello WebSocket</title> 
    <script type="text/javascript" src="./js/sockjs-0.3.4.js"></script> 
    <script type="text/javascript" src="./js/stomp.js"></script> 
    <script type="text/javascript"> 
     var stompClient = null; 

     function setConnected(connected) { 
      document.getElementById('connect').disabled = connected; 
      document.getElementById('disconnect').disabled = !connected; 
      document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden'; 
      document.getElementById('response').innerHTML = ''; 
     } 

     function connect() { 

      var socket = new SockJS("<c:url value='/hello'/>"); 
      stompClient = Stomp.over(socket); 
      stompClient.connect({}, function(frame) { 
       setConnected(true); 
       console.log('Connected: ' + frame); 
       window.alert('Connected: ' + frame); 
       stompClient.subscribe('/topic/greetings', function(greeting){ 
        showGreeting(JSON.parse(greeting.body).content); 
       }); 
      }); 
     } 

     function disconnect() { 
      if (stompClient != null) { 
       stompClient.disconnect(); 
      } 
      setConnected(false); 
      console.log("Disconnected"); 
     } 

     function sendName() { 
      var name = document.getElementById('name').value; 
      stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name })); 
     } 

     function showGreeting(message) { 
      var response = document.getElementById('response'); 
      var p = document.createElement('p'); 
      p.style.wordWrap = 'break-word'; 
      p.appendChild(document.createTextNode(message)); 
      response.appendChild(p); 
     } 
    </script> 
</head> 
<body> 
<noscript><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websocket relies on Javascript being enabled. Please enable 
    Javascript and reload this page!</h2></noscript> 
<div> 
    <div> 
     <button id="connect" onclick='connect();'>Connect</button> 
     <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button> 
    </div> 
    <div id="conversationDiv"> 
     <label>What is your name?</label><input type="text" id="name" /> 
     <button id="sendName" onclick="sendName();">Send</button> 
     <p id="response"></p> 
    </div> 
</div> 
</body> 
</html> 

WebSocketConfig.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:websocket="http://www.springframework.org/schema/websocket" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/websocket 
     http://www.springframework.org/schema/websocket/spring-websocket.xsd"> 

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

</beans> 

HelloMessage.java

package com.springws.test; 

public class HelloMessage { 

    private String name; 

    public String getName() { 
     return name; 
    } 

} 

Greeting.java

package com.springws.test; 

public class Greeting { 

    private String content; 

    public Greeting(String content) { 
     this.content = content; 
    } 

    public String getContent() { 
     return content; 
    } 

} 

GreetingController.java

package com.springws.test; 

import org.springframework.messaging.handler.annotation.MessageMapping; 
import org.springframework.messaging.handler.annotation.SendTo; 
import org.springframework.stereotype.Controller; 

@Controller 
public class GreetingController { 

    @MessageMapping("/hello") 
    @SendTo("/topic/greetings") 
    public Greeting greeting(HelloMessage message) throws Exception { 

     System.out.println(message.getName()); 
     return new Greeting("Hello, " + message.getName() + "!"); 
    } 

} 

的web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     id="WebApp_ID" 
     version="3.0"> 
    <display-name>CRUDWebAppMavenized</display-name> 

    <listener> 
     <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
    </listener> 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> /WEB-INF/WebSocketConfig.xml</param-value> 

</context-param> 

    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 


    <welcome-file-list> 

    <welcome-file>index.jsp</welcome-file> 

    </welcome-file-list> 
</web-app> 

弹簧servlet.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:jee="http://www.springframework.org/schema/jee" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
      http://www.springframework.org/schema/jee  http://www.springframework.org/schema/jee/spring-jee.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
      http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
      http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd 
      http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <mvc:annotation-driven/> 
    <mvc:default-servlet-handler/> 

    <context:annotation-config /> 

    <context:component-scan base-package="com.springws.test" /> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
    <tx:annotation-driven /> 

</beans> 

WebSocketConfig.java

package com.springws.test; 

import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.messaging.simp.config.MessageBrokerRegistry; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; 
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; 
import org.springframework.web.socket.config.annotation.StompEndpointRegistry; 

@Configuration 
@ComponentScan(basePackages = {"com.springws.test"}) 
@EnableWebSocketMessageBroker 
@EnableWebMvc 
@Controller 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     config.enableSimpleBroker("/topic"); 
     config.setApplicationDestinationPrefixes("/app"); 
    } 

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


} 

Libraries

但在浏览器控制台

其给出以下输出

Opening Web Socket... 
stomp.js:145 Web Socket Opened... 
stomp.js:145 >>> CONNECT 
accept-version:1.1,1.0 
heart-beat:10000,10000 

Whoops! Lost connection to undefined 

为什么它丢失连接?

+0

你最好从https://spring.io/guides/gs/messaging-stomp-websocket/开始 - 我在你的应用中看到很多问题;你正在为同样的事情**(这里是websocket)混合java config和xml config **,你在xml配置中使用了版本化的XSD(你不应该,特别是如果它是错误的版本)等等。 – 2015-03-25 10:19:21

+0

我按照你的建议做同样的事情,但我试着用spring mvc。 – ARNAB2012 2015-03-25 10:57:15

回答

2

我找到了答案。我错过了三个图书馆。

  1. 杰克逊 - 注解-2.5.1.jar,
  2. 杰克逊 - 核 - 2.5.1.jar,
  3. 杰克逊 - 数据绑定-2.5.1.jar

,我删除了旧的库jackson-annotations-2.1.2.jar并添加了这三个库。现在它的工作就像deram