我通过STOMP通过SockJS连接到我的Spring后端。一切正常,所有浏览器等的配置都很好。但是,我找不到发送初始消息的方法。该方案如下:
函数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();
}
通常,当模板已经自动连线时,我会以以下方式执行此操作,例如在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部分 …
你好我是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的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) 我在向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) 我有奇怪的情况,我无法重现,它只是发生.任何人都知道它是什么以及为什么会这样.我导致我的应用程序强制重启,否则无效.
[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) 设置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) 无法理解我在用于开发涉及图像/视频的聊天应用程序的websocket配置中的不同参数:
我注意到网页中的SockJs发送帧大小为16K的消息.我还测试了消息大小限制是什么决定了我可以传输的消息的最大大小.
能不能让我知道是什么:
流字节限制
发送缓冲区大小限制
http消息缓存大小
什么是部分消息以及如何使用它们,它们在这里有用吗?
此外,我计划将图像/视频的最大尺寸设置为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)
}
我有以下控制器
@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) 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。我已经成功运行了此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-websocket ×10
spring ×6
sockjs ×3
java ×2
stomp ×2
tomcat ×2
javascript ×1
react-native ×1
spring-boot ×1
spring-mvc ×1
stream ×1
webrtc ×1
websocket ×1