标签: spring-websocket

如何在连接事件(SockJS,STOMP,Spring)上发送消息?

我通过STOMP通过SockJS连接到我的Spring后端。一切正常,所有浏览器等的配置都很好。但是,我找不到发送初始消息的方法。该方案如下:

  1. 客户端连接到主题
    函数connect(){
        var socket = new SockJS('http:// localhost:8080 / myEndpoint');
        stompClient = Stomp.over(socket);
        stompClient.connect({},function(frame){
            setConnected(true);
            console.log('Connected:'+ frame);
            stompClient.subscribe('/ topic / notify',function(message){
                showMessage(JSON.parse(message.body).content);
            });
        });
    }

后端配置大致如下所示:

    @组态
    @EnableWebSocketMessageBroker
    公共类WebSocketAppConfig扩展了AbstractWebSocketMessageBrokerConfigurer {   
    ...
    @Override
    公共无效registerStompEndpoints(最终StompEndpointRegistry注册表){
        Registry.addEndpoint(“ / myEndpoint”)。withSockJS();
    }

  1. 我想从后端(在连接事件上)向客户端发送自动答复,这样我就可以为他提供一些数据集(例如,从数据库中读取某物),而无需他(客户端)发送GET。请求(或其他任何请求)。综上所述,我只想在他连接之后向他发送有关SimMessagingTemplate对象的主题消息。

通常,当模板已经自动连线时,我会以以下方式执行此操作,例如在REST控制器中:

    @Autowired
    私有SimpMessagingTemplate模板;
    ...
    template.convertAndSend(主题,新消息(“成功!”));

如何在连接事件上实现这一目标?

更新

我设法使它起作用。但是,我对配置还是有些困惑。我将在此处显示2种配置如何发送初始消息:

1)第一个解决方案

JS部分

stompClient.subscribe('/app/pending', function(message){
    showMessage(JSON.parse(message.body).content);
});
stompClient.subscribe('/topic/incoming', function(message){
    showMessage(JSON.parse(message.body).content);
});
Run Code Online (Sandbox Code Playgroud)

Java部分

@Controller
public class WebSocketBusController {
    @SubscribeMapping("/pending")
Run Code Online (Sandbox Code Playgroud)

组态

@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
}
Run Code Online (Sandbox Code Playgroud)

...和其他电话

template.convertAndSend("/topic/incoming", outgoingMessage);
Run Code Online (Sandbox Code Playgroud)

2)第二种解决方案

JS部分 …

spring sockjs spring-websocket

5
推荐指数
2
解决办法
1万
查看次数

java.lang.IllegalStateException:SockJsMessageCodec是必需的但不可用:

你好我是websocket的新手.我不知道为什么我得到这个例外.

 java.lang.IllegalStateException: A SockJsMessageCodec is required but not available: Add Jackson 2 to the classpath, or configure a custom SockJsMessageCodec.
    at org.springframework.util.Assert.state(Assert.java:385)
    at org.springframework.web.socket.sockjs.transport.TransportHandlingSockJsService.getMessageCodec(TransportHandlingSockJsService.java:130)
    at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.handleMessage(WebSocketServerSockJsSession.java:187)
    at org.springframework.web.socket.sockjs.transport.handler.SockJsWebSocketHandler.handleTextMessage(SockJsWebSocketHandler.java:92)
    at org.springframework.web.socket.handler.AbstractWebSocketHandler.handleMessage(AbstractWebSocketHandler.java:43)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.handleTextMessage(StandardWebSocketHandlerAdapter.java:112)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.access$000(StandardWebSocketHandlerAdapter.java:42)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:82)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:79)
    at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:369)
    at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:468)
    at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:272)
    at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:116)
    at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:54)
    at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:192)
    at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:178)
    at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:92)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:601)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745) 

我的控制台输出

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


Whoops! Lost …
Run Code Online (Sandbox Code Playgroud)

spring spring-messaging spring-websocket

5
推荐指数
2
解决办法
2542
查看次数

如何在HandshakeInterceptor中设置Principal

我正在使用Spring的WebSockets的非常薄的实现.WebSocketSession有方法getPrincipal(),但是如何在HandshakeInterceptor中设置它?

我想把Principal放在的方法是:

public boolean beforeHandshake(final ServerHttpRequest request, final ServerHttpResponse response, final WebSocketHandler wsHandler,
        final Map<String, Object> attributes) throws Exception {
    Principal = getPrincipal();
    // Now where to set the principal so it is available in WebSocketSession?

}
Run Code Online (Sandbox Code Playgroud)

spring-websocket

5
推荐指数
1
解决办法
1601
查看次数

javax.servlet.ServletException:没有在Jetty上运行,JSR-356支持不可用

我在向tomcat实例部署战争时遇到问题,

Tomcat版本细节,

D:\Kiran\Kiran\Softwares DH\Webservers\apache-tomcat-7.0.63\bin>version.bat
Using CATALINA_BASE:   "D:\Kiran\Kiran\Softwares DH\Webservers\apache-tomcat-7.0.63"
Using CATALINA_HOME:   "D:\Kiran\Kiran\Softwares DH\Webservers\apache-tomcat-7.0.63"
Using CATALINA_TMPDIR: "D:\Kiran\Kiran\Softwares DH\Webservers\apache-tomcat-7.0.63\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.7.0_07"
Using CLASSPATH:       "D:\Kiran\Kiran\Softwares DH\Webservers\apache-tomcat-7.0.63\bin\bootstrap.jar;D:\Kiran\Kiran\Softwares DH\Webservers\apache-to
mcat-7.0.63\bin\tomcat-juli.jar"
Server version: Apache Tomcat/7.0.63
Server built:   Jun 30 2015 08:08:33 UTC
Server number:  7.0.63.0
OS Name:        Windows 7
OS Version:     6.1
Architecture:   amd64
JVM Version:    1.7.0_07-b11
JVM Vendor:     Oracle Corporation
D:\Kiran\Kiran\Softwares DH\Webservers\apache-tomcat-7.0.63\bin>
Run Code Online (Sandbox Code Playgroud)

POM依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我使用maven插件创建了一个war并尝试在tomcat 7上部署.我能够部署但无法启动webapp.当我找到它的日志时,它给出了下面的堆栈跟踪,

SEVERE: Error during ServletContainerInitializer processing
javax.servlet.ServletException: Not running on Jetty, JSR-356 support unavailable
    at org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.onStartup(WebSocketServerContainerInitializer.java:146) …
Run Code Online (Sandbox Code Playgroud)

java spring tomcat spring-websocket

5
推荐指数
2
解决办法
9650
查看次数

Spring websocket + Spring boot嵌入式tomcat问题

我有奇怪的情况,我无法重现,它只是发生.任何人都知道它是什么以及为什么会这样.我导致我的应用程序强制重启,否则无效.

[INFO ] 2016-02-18 16:41:03.584 [http-nio-8443-exec-1] WsRemoteEndpointImplServer - Failed to close the ServletOutputStream connection cleanly
java.io.IOException: Broken pipe
        at sun.nio.ch.FileDispatcherImpl.write0(Native Method) ~[?:1.8.0_40]
        at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[?:1.8.0_40]
        at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[?:1.8.0_40]
        at sun.nio.ch.IOUtil.write(IOUtil.java:51) ~[?:1.8.0_40]
        at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) ~[?:1.8.0_40]
        at org.apache.tomcat.util.net.SecureNioChannel.flush(SecureNioChannel.java:140) ~[tomcat-embed-core-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.util.net.SecureNioChannel.close(SecureNioChannel.java:385) ~[tomcat-embed-core-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.util.net.SecureNioChannel.close(SecureNioChannel.java:413) ~[tomcat-embed-core-8.0.30.jar!/:8.0.30]
        at org.apache.coyote.http11.upgrade.NioServletOutputStream.doClose(NioServletOutputStream.java:138) ~[tomcat-embed-core-8.0.30.jar!/:8.0.30]
        at org.apache.coyote.http11.upgrade.AbstractServletOutputStream.close(AbstractServletOutputStream.java:140) ~[tomcat-embed-core-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doClose(WsRemoteEndpointImplServer.java:142) [tomcat-embed-websocket-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.close(WsRemoteEndpointImplBase.java:638) [tomcat-embed-websocket-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.onWritePossible(WsRemoteEndpointImplServer.java:117) [tomcat-embed-websocket-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:80) [tomcat-embed-websocket-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:450) [tomcat-embed-websocket-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(WsRemoteEndpointImplBase.java:338) [tomcat-embed-websocket-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessageBlock(WsRemoteEndpointImplBase.java:270) [tomcat-embed-websocket-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.websocket.WsSession.sendCloseMessage(WsSession.java:584) [tomcat-embed-websocket-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:520) [tomcat-embed-websocket-8.0.30.jar!/:8.0.30]
        at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.close(WsHttpUpgradeHandler.java:163) [tomcat-embed-websocket-8.0.30.jar!/:8.0.30]
        at …
Run Code Online (Sandbox Code Playgroud)

spring tomcat websocket spring-boot spring-websocket

5
推荐指数
0
解决办法
1075
查看次数

Webrtc远程视频流不起作用

设置remoteDescription时,我在Firefox中遇到以下错误:

DOMException [InvalidStateError:“无法在状态have-local-offer中设置远程报价”代码:11 nsresult:0x8053000b位置:http:// localhost:8080 / resources / assets / js / test-online.js:111]

请在下面找到我的test-online.js代码

var localVideo;
var remoteVideo;
var peerConnection;
var serverConnection;
var peerConnectionConfig = {'iceServers': [{'url': 'stun:stun.services.mozilla.com'}, {'url': 'stun:stun.l.google.com:19302'}]};
pageReady();
var offerOptions = {
          offerToReceiveAudio: 1,
          offerToReceiveVideo: 1
        };

var sdpConstraints = {'mandatory': {
      'OfferToReceiveAudio':true,
      'OfferToReceiveVideo':true }};

function pageReady() {
    localVideo = document.getElementById('localVideo');
    remoteVideo = document.getElementById('remoteVideo');

    localVideo.addEventListener('loadedmetadata', function() {
          trace('Local video videoWidth: ' + this.videoWidth +
            'px,  videoHeight: ' + this.videoHeight + 'px');
    });

    remoteVideo.addEventListener('loadedmetadata', function() {
          trace('Remote …
Run Code Online (Sandbox Code Playgroud)

javascript stream webrtc spring-websocket

5
推荐指数
1
解决办法
3834
查看次数

Spring Stomp over Websocket:消息/缓冲区/缓存/流限制

无法理解我在用于开发涉及图像/视频的聊天应用程序的websocket配置中的不同参数:

我注意到网页中的SockJs发送帧大小为16K的消息.我还测试了消息大小限制是什么决定了我可以传输的消息的最大大小.

能不能让我知道是什么:

  1. 流字节限制

  2. 发送缓冲区大小限制

  3. http消息缓存大小

  4. 什么是部分消息以及如何使用它们,它们在这里有用吗?

  5. 此外,我计划将图像/视频的最大尺寸设置为2GB,并在发布时预计大约100个并发用户.

您能告诉我们应该保留哪些尺寸以及为什么?什么是默认值?以及每个人如何影响我的聊天应用程序的性能?

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/stomp").withSockJS()
            .setStreamBytesLimit(15 * 1024)
            .setHttpMessageCacheSize(15 * 1024);
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/queue/", "/topic/", "/exchange/");
    registry.setApplicationDestinationPrefixes("/app");
}

@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
    registration.setSendTimeLimit(15 * 1000)
            .setSendBufferSizeLimit(1 * 1024)
            // max message size 2GB (2048 bytes) : default is 64KB
            .setMessageSizeLimit(2 * 1024 * 1024);
}
Run Code Online (Sandbox Code Playgroud)

}

java spring stomp sockjs spring-websocket

5
推荐指数
1
解决办法
1869
查看次数

SimpMessagingTemplate不向websocket发送消息

我有以下控制器

@Controller
public class GreetingController 
{
        @MessageMapping("/hello")
        @SendTo("/topic/greetings")
        public Person greeting(String message) throws Exception {
                Person person=new Person();
                person.setAge(10);
                return person;
        }
        @Autowired
        private SimpMessagingTemplate template;

        @RequestMapping(path="/meeting",method=RequestMethod.POST)
        public  @ResponseBody void greet() {
            this.template.convertAndSend("/topic/greetings", "message");
         }
    }
Run Code Online (Sandbox Code Playgroud)

我的配置是

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig1 extends AbstractWebSocketMessageBrokerConfigurer {

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

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/hello").withSockJS();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,根据spring doc template.convertAndSend("/ topic/greetings","message")应该调用代理并调用映射的Web套接字.

使用SockJS的前端代码

var socket = new SockJS('/hello');
                     stompClient = Stomp.over(socket);
                     stompClient.connect({}, function(frame) {
                         console.log('Connected: …
Run Code Online (Sandbox Code Playgroud)

spring-websocket

5
推荐指数
1
解决办法
2291
查看次数

使用React Native客户端和Jetty Spring服务器的无效Sec-WebSocket-Accept响应

var ws = new WebSocket('ws://localhost:8080/activity/hello');

ws.onopen = () => {
    // connection opened
    ws.send('something'); // send a message
};

ws.onmessage = (e) => {
   // a message was received
    console.log(e.data);
};

ws.onerror = (e) => {

    // an error occurred
    console.log(e.message);
};

ws.onclose = (e) => {
    // connection closed
    console.log(e.code, e.reason);
};
Run Code Online (Sandbox Code Playgroud)

如何获得服务器返回的值?客户还期望什么?

谢谢阿米什

spring-websocket react-native

5
推荐指数
0
解决办法
363
查看次数

SockJS无法创建/连接到Spring WebSocket

我正在学习Spring WebSocket。我已经成功运行了此Spring WebSocket教程。现在,我试图按原样将其合并到我现有的Spring MVC应用程序中。当我从Chrome浏览器运行它时,在其开发控制台中看到以下错误。

Chrome控制台

Opening Web Socket...
GET http://localhost:8080/MyAppName/api/gs-guide-websocket/info?t=1497735312528 500 (Internal Server Error) -- abstract-xhr.js:132
Whoops! Lost connection to http://localhost:8080/MyAppName/api/gs-guide-websocket -- stomp.min.js:8 
Run Code Online (Sandbox Code Playgroud)

服务器端错误

javax.servlet.ServletException: Could not resolve view with name '/MyAppName/api/gs-guide-websocket/info' in servlet with name 'MyAppName'
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1262)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037)
Run Code Online (Sandbox Code Playgroud)

客户端

function connect() {
    var socket = new SockJS('/MyAppName/api/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

服务器端

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig …
Run Code Online (Sandbox Code Playgroud)

spring stomp spring-mvc sockjs spring-websocket

5
推荐指数
1
解决办法
2179
查看次数