2016-08-15 2 views
1

Я пытаюсь создать автономное приложение Java в качестве клиента websocket, использующего эту Spring с Stomp и Sockjs, принимая во внимание весенние спецификации и примеры spring-portafolio и Я получаю эту ошибку:Websocket java client Spring + Stomp: Ошибка транспорта: ConnectionLostException

15:18:01.342 [main] DEBUG com.example.client.WebSocketClientTest - Connecting to : ws://localhost:8080/socket/hello 
15:18:01.541 [WebSocketClient-AsyncIO-1] ERROR com.example.client.MyStompSessionHandler - Transport error 
org.springframework.messaging.simp.stomp.ConnectionLostException: Connection closed 
at org.springframework.messaging.simp.stomp.DefaultStompSession.afterConnectionClosed(DefaultStompSession.java:483) [spring-messaging-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.web.socket.messaging.WebSocketStompClient$WebSocketTcpConnectionHandlerAdapter.afterConnectionClosed(WebSocketStompClient.java:354) [spring-websocket-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.web.socket.sockjs.client.AbstractClientSockJsSession.afterTransportClosed(AbstractClientSockJsSession.java:321) [spring-websocket-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.web.socket.sockjs.client.WebSocketTransport$ClientSockJsWebSocketHandler.afterConnectionClosed(WebSocketTransport.java:172) [spring-websocket-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.onClose(StandardWebSocketHandlerAdapter.java:141) [spring-websocket-4.3.2.RELEASE.jar:4.3.2.RELEASE]... 

Мой код на стороне клиента Java является:

StandardWebSocketClient webSocketClient = new StandardWebSocketClient(); 
List<Transport> transports = new ArrayList<>(); 
transports.add(new WebSocketTransport(webSocketClient)); 
SockJsClient sockJsClient = new SockJsClient(transports); 
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); 
taskScheduler.afterPropertiesSet(); 
String stompUrl = "ws://localhost:8080/socket/hello"; 
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient); 
stompClient.setMessageConverter(new StringMessageConverter()); 
stompClient.setTaskScheduler(taskScheduler); 
stompClient.setDefaultHeartbeat(new long[] {0, 0}); 

StompSessionHandler sessionHandler = new MyStompSessionHandler(); 
stompClient.connect(stompUrl, sessionHandler); 
stompClient.setTaskScheduler(taskScheduler); 

и на стороне сервера было сделано с использованием Spring MVC с Stomp и SockJs, сервер отлично работает с javascript client, это конфиг, который Я использовал:

public void configureMessageBroker(MessageBrokerRegistry config) { 
    config.enableSimpleBroker("/topic"); 
    config.setApplicationDestinationPrefixes("/app"); 
} 
public void registerStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/hello") 
      .setHandshakeHandler(new DefaultHandshakeHandler(new TomcatRequestUpgradeStrategy())) 
      .withSockJS(); 
} 

Что я делаю неправильно? Может ли кто-нибудь дать мне представление о том, как его исправить или как создать клиент Java для подключения к серверу весеннего websocket?

Заранее спасибо ..

ответ

1

У меня была та же проблема. Причиной стало получение слишком большого сообщения, которое по умолчанию клиент STOMP Spring/Tomcat WS не может обрабатывать, потому что не может отправлять частичные сообщения. This StackOverflow answer работал для меня (я поставил MAX_TEXT_MESSAGE_BUFFER_SIZE=20*1024*1024):

WebSocketContainer container = ContainerProvider.getWebSocketContainer(); 
container.setDefaultMaxTextMessageBufferSize(MAX_TEXT_MESSAGE_BUFFER_SIZE); 
WebSocketClient wsClient = new StandardWebSocketClient(container); 

Установка inboundMessageSizeLimit не имели никакого эффекта:

WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient); 
stompClient.setInboundMessageSizeLimit(Integer.MAX_VALUE); 
Смежные вопросы