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