2016-09-24 2 views
0

Ich habe Websocket im Frühjahr implementiert, aber der JavaScript-Client kann keine Verbindung zum Websocket herstellen. HierJavaScript-Client kann keine Verbindung zu Spring 4 herstellen WebSocket

ist die WebSocketConfig Klasse:

package com.myapp.spring.security.config; 
import com.myapp.spring.web.controller.MyWebSocketHandler; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
//import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
//import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.socket.WebSocketHandler; 
import org.springframework.web.socket.config.annotation.EnableWebSocket; 
import org.springframework.web.socket.config.annotation.WebSocketConfigurer; 
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; 
import org.springframework.web.socket.handler.PerConnectionWebSocketHandler; 

@Configuration 
@EnableWebMvc 
@EnableWebSocket 
@ComponentScan(basePackages={"com.myapp.spring.*"}) 
public class WebSocketConfig implements WebSocketConfigurer { 

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
     registry 
       .addHandler(myWebSocketHandler(), "/endpoint") 
       .setAllowedOrigins("*"); 
    } 

    @Bean 
    public WebSocketHandler myWebSocketHandler() { 
     return new PerConnectionWebSocketHandler(MyWebSocketHandler.class); 
    } 


} 

Hier ist die test.html Seite, die mit dem websocket versucht, eine Verbindung:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" 
     xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"> 

     <body> 

     <p>Going to connect to the WebSocket at /endpoint. Check Console</p> 
     <button onclick="ss()">Send</button> 
     </body> 

     <script type="text/javascript"> 
     var webSocket = new WebSocket("wss://"+document.location.hostname+":8443"+"/endpoint"); 
     webSocket.onopen = function(message) { 
       processOpen(message); 
      }; 
      webSocket.onmessage = function(message) { 
       processMessage(message); 
      }; 
      webSocket.onclose = function(message) { 
       processClose(message); 
      }; 
      webSocket.onerror = function(message) { 
       processError(message); 
      }; 


      function processOpen(message) { 
       console.log("JS: Server Connected... "+message); 
      } 
      function processMessage(message) { 
       console.log("Getting a mess: "+message); 
      } 
      function processClose(message) { 
       console.log("JS: Client disconnected... "+message); 
      } 
      function processError(message) { // 
       console.log("Error occured: "+message); 
      } 

      function ss() { 
       webSocket.send("test"); 
      } 
     </script> 

</html> 

ich den websocket Pfad initialisiert bei /endpoint zu sein. Dies wird durch meine Server-Logs, die sagen, dass dies geschehen ist:

[org.springframework.web.socket.server.support.WebSocketHandlerMapping] (ServerService Thread Pool -- 75) Mapped URL path [/endpoint] onto handler of type [class org.springframework.web.socket.server.support.WebSocketHttpRequestHandler] 

Wenn ich test.html öffnen, die Verbindung öffnet und sofort trennt. Die Funktionen processOpen(message) und processClose(message) werden sofort nacheinander aufgerufen. Was mache ich falsch und wie kann ich das beheben?

Antwort

0

Ihr Java-Script-Code in test.html sieht gut aus. Es könnte ein Problem mit der Spring Web Socket-Konfiguration geben, die die Verbindung schließt. Nachfolgend ist der Arbeitscode für den Web-Socket mit Spring-Boot. Bitte vergleichen Sie mit Ihrer Konfiguration.

Web-Buchse Abhängigkeit in pom.xml

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-websocket</artifactId> 
</dependency> 

WebSocketHandler Klasse

@Component 
public class EchoHandler extends TextWebSocketHandler { 
@Override 
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { 
    TextMessage echoMessage = new TextMessage("Echo :" + message.getPayload()); 
    System.out.println("Sending "+echoMessage.getPayload()); 
    session.sendMessage(echoMessage); 
    } 
} 

WebSocket Controller-Klasse

@EnableWebSocket 
@Controller 
public class WSController implements WebSocketConfigurer { 
@Autowired 
private EchoHandler echoHandler; 

@Override 
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
    registry.addHandler(echoHandler, "/echo").setAllowedOrigins("*"); 
    } 
} 

Frühling Boot-Anwendung Klasse

@SpringBootApplication 
public class WSApplication { 

public static void main(String[] args) { 
    SpringApplication.run(WSApplication.class, args); 
    } 
} 
+0

Das hat nicht funktioniert. Ich habe einen Fehler (etwas, das besagt, dass eine Bean erforderlich war) in der WebSocketConfig – user5139637

+0

erhalten. Können Sie bitte die genaue Fehlermeldung und Ihre aktualisierten Klassen anzeigen? Der Code, den ich gepostet habe, funktioniert gut für mich. – abaghel

+0

kann und kann ich definitiv. Aber nach dem Stellen dieser Frage wurde mir klar, dass meine Frage zu Web Sockets etwas anders ist. Ich machte einen anderen SO Post: http://stackoverflow.com/questions/39683062/enable-cors-for-websockets-in-spring Wenn Sie dabei helfen könnten, wäre es fantastisch. Ich danke dir sehr – user5139637

Verwandte Themen