出于某种原因,sockjs将一堆请求信息打印到我的控制台中.我没有告诉它在我的代码中的任何地方这样做.
例如;
GET /echo/info 1ms 200
GET echo/332/ed2323/websocket 1ms
etc
Run Code Online (Sandbox Code Playgroud)
有可能以某种方式扭转这种局面吗?
我希望能够检测到用户何时失去了与服务器的连接(关闭的选项卡、失去了互联网连接等)我在我的客户端上通过 Sockjs 使用 stompjs,在我的服务器上使用 spring mvc websockets。
我如何检测客户端何时失去连接。这是我如何配置我的 websocket 消息 brocket:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
@Autowired
private TaskScheduler scheduler;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic").setHeartbeatValue(new long[]{10000, 10000}).setTaskScheduler(scheduler);
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/web").setAllowedOrigins("*").withSockJS();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器类,它实际上处理传入的套接字消息:
@RestController
@CrossOrigin
public class WebMessagingController {
@MessageMapping("/chat/message")
public void newUserMessage(String json) throws IOException {
messagesProcessor.processUserMessage(json);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道如果我使用从TextWebSocketHandler扩展的类,我将有 bean 能够覆盖在客户端连接和断开连接时调用的方法,但我认为这不适用于sock-js 客户端。谢谢你。
目标是使用 Web 界面和 Spring 框架进行多房间聊天。看起来STOMP over SockJS是此类项目的最佳组合。STOMP 基于目的地的订阅解决了所有广播问题。但是,如果用户一次使用 100 个(例如)聊天,我需要在每次登录时从 Web 客户端发送 100 个订阅请求。
所以我正在寻找替代的单请求解决方案。让我来整理一下问题:
1) 有没有一种方法可以同时向多个订阅发出一个客户端 STOMP 请求?如果可以使用其他 JS 库发出这样的请求 - 那么我会很高兴尝试它。
2)有没有办法从Spring后端发起订阅?最好在服务器端为一个客户端注册多个目标消息查询 - 我可以为此使用特殊请求或在登录期间执行此操作。
3)关于这个问题还有其他建议吗?再说一遍:我很高兴尝试其他流行技术作为最后的手段。
下面的代码是最简单的 echo 服务。我只是测试这个协议和技术。
基本客户端代码:
window.onload = function () {
window.s = new SockJS("http://localhost:8080/portfolio");
window.s.onopen = function () {
window.stompClient = Stomp.over(window.s);
stompClient.connect('admin', 'admin', function(frame) {
console.log('Connected: ', frame);
stompClient.subscribe('/topic/echo', function(messageOutput) {
console.log(messageOutput.body);
})}, function(e){console.log("Fail My: ", e);})();
};
};
Run Code Online (Sandbox Code Playgroud)
踩踏配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void …Run Code Online (Sandbox Code Playgroud) 我将首先从我所知道的开始,因为它可能对其他人有用。
很明显,您可以使用协议子集实例化 SockJS:
sockJsProtocols = ["xhr-streaming", "xhr-polling", ....];
socket.cliente = new SockJS(url, null, {transports: sockJsProtocols}));
Run Code Online (Sandbox Code Playgroud)
我还发现,当 SockJS 调用 /info 端点时,服务器返回 websockets true 或 false(取决于服务器兼容性)。
我还知道这里有一个漂亮的表,有 3 列:websockets、流式传输和轮询。
但我有两个问题:
1) SockJS 如何决定轮询、流式传输还是 websocket?它不能与浏览器兼容性有关,因为我在日志中看到许多使用最新浏览器的 XHRStreaming 会话。怎么这在任何地方都没有记录?
2)为什么SockJS每次都需要调用/info?服务器的兼容性将始终相同。
sockjs ×4
java ×1
javascript ×1
node.js ×1
spring ×1
spring-mvc ×1
stomp ×1
stompjs ×1
websocket ×1