2016-05-18 7 views
2
package springwebsocketclient; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 
import org.springframework.http.HttpHeaders; 
import org.springframework.messaging.simp.stomp.StompHeaders; 
import org.springframework.web.socket.WebSocketHttpHeaders; 
import org.springframework.web.socket.client.standard.StandardWebSocketClient; 
import org.springframework.web.socket.messaging.WebSocketStompClient; 
import org.springframework.web.socket.sockjs.client.RestTemplateXhrTransport; 
import org.springframework.web.socket.sockjs.client.SockJsClient; 
import org.springframework.web.socket.sockjs.client.Transport; 
import org.springframework.web.socket.sockjs.client.WebSocketTransport; 
import org.springframework.web.socket.sockjs.frame.SockJsMessageCodec; 

/** 
* 
* @author Anurag 
*/ 
public class SimpleSpringWebSocketClient { 

    public static void main(String[] args) { 
     StandardWebSocketClient standardWebSocketClient = new StandardWebSocketClient(); 
     WebSocketTransport socketTransport = new WebSocketTransport(standardWebSocketClient); 
     List<Transport> transports = new ArrayList<>(); 
     transports.add(socketTransport); 
     SockJsClient sockJsClient = new SockJsClient(transports); 
     sockJsClient.setMessageCodec(new SockJsMessageCodec() { 
      @Override 
      public String encode(String... messages) { 
       System.out.println("inside encode"); 
       return ""; 

      } 

      @Override 
      public String[] decode(String content) throws IOException { 
       System.out.println("inside decode"); 
       return new String[10]; 
      } 

      @Override 
      public String[] decodeInputStream(InputStream content) throws IOException { 
       System.out.println("inside decodeInputStream"); 
       return new String[10]; 
      } 
     }); 
     WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient); 
     String host = "192.168.3.202"; 
     int port = 8080; 
     String stompUrl = "ws://" + host + ":" + port + "/hello"; 
     WebSocketHttpHeaders webSocketHttpHeaders = new WebSocketHttpHeaders(new HttpHeaders()); 
     LocalStompSessionHandler handler = new LocalStompSessionHandler(); 
     StompHeaders stompHeaders = new StompHeaders(); 
     try { 
      //stompClient.connect(stompUrl, new LocalStompSessionHandler()); 
      stompClient.connect(stompUrl, handler); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     stompClient.setAutoStartup(true); 
    } 
} 

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package springwebsocketclient; 

import java.lang.reflect.Type; 
import org.springframework.messaging.simp.stomp.StompCommand; 
import org.springframework.messaging.simp.stomp.StompFrameHandler; 
import org.springframework.messaging.simp.stomp.StompHeaders; 
import org.springframework.messaging.simp.stomp.StompSession; 
import org.springframework.messaging.simp.stomp.StompSessionHandler; 

/** 
* 
* @author Anurag 
*/ 
public class LocalStompSessionHandler implements StompSessionHandler{ 

    @Override 
    public void afterConnected(StompSession session, StompHeaders connectedHeaders) { 
     System.out.println("connectedHeaders = " + connectedHeaders); 
    } 

    @Override 
    public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public void handleTransportError(StompSession session, Throwable exception) { 

    } 

    @Override 
    public Type getPayloadType(StompHeaders headers) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public void handleFrame(StompHeaders headers, Object payload) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 


} 


Server Implementation 
package hello; 

import org.springframework.context.annotation.Configuration; 
import org.springframework.messaging.simp.config.MessageBrokerRegistry; 
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 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

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

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
      System.out.println("control come here"); 
     registry.addEndpoint("/hello").withSockJS(); 
    } 

package hello; 

public class HelloMessage { 

    private String name; 

    public String getName() { 
     return name; 
    } 

} 

package hello; 

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 { 
     Thread.sleep(3000); // simulated delay 
     return new Greeting("Hello, " + message.getName() + "!"); 
    } 

} 

package hello; 

public class Greeting { 

    private String content; 

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

    public String getContent() { 
     return content; 
    } 

} 

package hello; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
public class Application { 

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

私は、サーバーは、この例外の取得にクライアントを接続しようとしています:スタンドアロンクライアントと春のWebソケットサーバー

May 18, 2016 6:14:15 PM org.springframework.web.socket.sockjs.client.DefaultTransportRequest$ConnectCallback handleFailure SEVERE: No more fallback transports after TransportRequest[url=ws://192.168.3.202:8080/hello/80/6af5b9dd5e0c4fd0be3daee63b74af0b/websocket] javax.websocket.DeploymentException: Handshake error. at org.glassfish.tyrus.client.ClientManager$3$1.run(ClientManager.java:636) at org.glassfish.tyrus.client.ClientManager$3.run(ClientManager.java:673) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.glassfish.tyrus.client.ClientManager$SameThreadExecutorService.execute(ClientManager.java:826) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:496) at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:348) at org.springframework.web.socket.client.standard.StandardWebSocketClient$1.call(StandardWebSocketClient.java:152) at org.springframework.web.socket.client.standard.StandardWebSocketClient$1.call(StandardWebSocketClient.java:149) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.lang.Thread.run(Thread.java:745) Caused by: org.glassfish.tyrus.core.HandshakeException: Response code was not 101: 403. at org.glassfish.tyrus.client.TyrusClientEngine.processResponse(TyrusClientEngine.java:419) at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientFilter.handleHandshake(GrizzlyClientFilter.java:343) at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientFilter.handleRead(GrizzlyClientFilter.java:313) at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561) at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) ... 1 more

APIのバージョンは次のとおりです。

Spring 4.2.5 
apache-loggings 1.1.1 
J2EE 7 
J2SE 8 
Jackson-all 1.9 
jacksone-core 2.2.3 
tyrus-standalone-client 1.12 

答えて

1

何CORS原点ヘッダーがありませんので定義されているので、403エラーが発生しています。 あなたは春のフレームワークのWebソケットのデバッグログを有効にすると、それは次のようなエラーが表示されます。

OriginHandshakeInterceptor - Handshake request rejected, Origin header value 192.168.3.202:8080 not allowed

は、あなたのエンドポイントにsetAllowedOrigins(「*」)またはsetAllowedOrigins(「http://192.168.3.202:8080」)を追加し、それが正常に動作します。

registry.addEndpoint("/hello").setAllowedOrigins("*").withSockJS(); 
関連する問題