问题标签 [spring-websocket]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
401 浏览

websocket - 使用 Websockets 时无法在 Spring Controller 中获取 ServletContext

请建议。我在控制器中使用 SimpMessageHeaderAccessor 获得会话,但我也需要 ServletContext。春天有什么办法吗?

0 投票
1 回答
1462 浏览

spring - 如何在 Spring Websocket 的 Spring SockJS 模块中禁用 CORS 标头的自动添加

我在我的项目中使用了 Spring SockJs 以获得一些 websocket 支持。根据文档,spring sockjs 库根据传入请求中的来源添加 CORS 标头 - 除非它检测到由 servlet 过滤器或任何机制添加的标头。http://docs.spring.io/autorepo/docs/spring-framework/current/spring-framework-reference/html/websocket.html(SockJS的第 21.3.6 节 CORS 标头)

我不确定自动添加标题是否是个好主意,但对于我的用例,我想禁用添加任何标题。所以我要么显式添加或删除它-Spring SOCKJS 不应该自动添加它。

有没有办法做到这一点?我探索了 SockJsService API,但想不通http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/socket/sockjs/support/AbstractSockJsService.html

0 投票
1 回答
538 浏览

tomcat - spring-websocket 的 RestTemplateXhrTransport 工作吗?

我正在尝试使用 spring-websocket RestTemplateXhrTransport 进行集成测试,但无法使其正常工作。

服务器使用 spring-websocket (4.1-RELEASE) 设置,并带有按书配置:

我本来希望下面的代码可以工作,但它只是在等待序言时超时。如果我查看网络流量,我可以看到前导码是由服务器发送的,但客户端在读取标头后只是挂起等待数据:

我正在使用 Tomcat 应用程序服务器。它无法与 7.0.55 和 8.0.12 一起使用。

我还尝试从 spring-websockets-portfolio 示例中查看 IntegrationPortfolioTests。如果我注释掉 setup-method 中添加 WebSocketTransport 作为主要传输的行并保留使用 RestTemplateXhrTransport 的行,则此测试用例也不起作用。

0 投票
1 回答
656 浏览

java - 套接字中缺少数据

我正在尝试编写 Java 代码以从流式 HTTP 连接接收数据(我想调试我在针对 spring-websocket 服务器运行 Sockjs XHR-streaming 时遇到的问题)。

我使用一些非常简单的代码来连接:

但是当我运行它时,我只得到 HTTP 标头。

这本身并不会太令人惊讶。我怀疑服务器没有正确发送内容。

但是当我使用 Wireshark 监控流量时,我可以看到我收到了三个 TCP 段来响应我的 POST。一个包含 1460 字节(+54 字节 TCP/IP 标头)、1178 字节之一(+54 字节标头)和 7 字节之一(+44 字节标头)。

第一个包含 HTTP 标头以及 878 字节的内容(Sockjs XHR 流以发送 2048 h 的前导码开始)。下一个包含序言的其余部分,最后一个包含“开放框架”。完全符合我对服务器的期望。

为什么我的 Java 代码收不到剩余的数据?当我使用原始套接字时,它应该完全不知道 HTTP 协议,所以我不明白为什么我只收到 HTTP 标头。服务器可能在写入标头后刷新数据,但我可以在网络转储中看到标头和数据的第一部分都包含在第一个 TCP 段中。

这是第一个收到的 TCP 段的转储:

这是代码的输出:

如何获取剩余数据?

编辑:如果我减小接收缓冲区大小在读取后将单个字节写入输出流,我似乎收到了丢失的数据。这是为什么?

0 投票
3 回答
11348 浏览

java - Spring 4 + Websockets:如何关闭会话?

我正在使用 Spring 4 + Websockets + Stomp JS 库。我找不到任何方法来设置 websocket ping/pong 机制(心跳)。

因此,我正在实现自己的 ping/pong 消息机制。

这里的任务之一 - 如果在超过 10 秒内没有来自客户端的 ping 消息,则实现 websocket 的服务器端关闭。

并且没有办法使用 Spring Websockets 来做到这一点!

也许有人可以告诉我如何访问用户的 Session 对象或通过 Spring Websockets 关闭这些 Session?

似乎春天在这里非常有限。

0 投票
1 回答
6494 浏览

websocket - Websockets:是否可以使用 SockJS 添加多个端点?

我想创建 2 个 Web 套接字端点。你能说这可能吗?

在这种情况下应该是什么配置?

0 投票
2 回答
12765 浏览

javascript - 是否可以使用 Spring-WebSockets 通过 WebSockets 通过 STOMP 发送二进制数据?

在spring 文档之后,我能够通过 WebSockets 使用 STOMP 发送和接收 JSON 。然而,在高速率下性能很差,所以我希望分析二进制消息的使用。

  • Spring-WebSockets 4.0
  • 在 Chrome 35 中运行的 JavaScript 客户端
  • stomp.js 1.7.1

发送

我使用 SimpMessageTemplate 和必要的代理中继发送消息 - 请参阅spring 文档

接收

JavaScript 客户端使用标准机制使用stomp.js接收数据。

消息被接收,但作为字符串,控制台输出如下。我期待一些原始类型,例如ArrayBuffer

我尝试过的事情

我意识到 STOMP 中的 T 代表文本,但是 Spring 文档暗示二进制消息至少可以使用普通的 WebSockets,stomp 规范也指出

STOMP 是基于文本的,但也允许传输二进制消息。

  • 调试发送代码,据我所知,它似乎保持为 byte []
  • 在接收时调试 stomp.js 库。在底层 ws.onmessage 回调(stomp-1.7.1.js 中的第 243 行)中收到消息时,该消息似乎是一个字符串
  • 大量搜索 - 这似乎是一个信息很少的罕见主题
  • 查看 stomp.js 源代码。对二进制的唯一引用是 ws.binaryType = "arraybuffer"。

更新:我在服务器端做了更多的调试。似乎 org.springframework.web.socket.TextMessage 总是在org.springframework.web.socket.messaging.StompSubProtocolHandler而不是 org.springframework.web.socket.BinaryMessage 中使用。我已经为此SPR-12301提出了功能请求

我的问题

  • 这种技术组合是否可行?
  • 我错过了一些关键步骤吗?
  • 谁能指出我的工作示例
0 投票
1 回答
818 浏览

java - 如何使用“WebApplicationInitializer”配置 spring-websocket

如何使用“WebApplicationInitializer”配置 spring-websocket:

WebAppInitializer.java

}

WebSocketConfig.java

GreetingController.java

索引.html

当我运行它时,浏览器控制台中发生错误。

0 投票
0 回答
367 浏览

java - Websocket消息丢失

我面临一个奇怪的问题,我的消息间歇性地没有到达经纪人。我正在使用 spring stomp 中继处理程序和 sockJS。我为此启用了调试日志记录,发现在消息未到达代理的情况下,不会触发 MESSAGE 命令。

2014-10-09 15:36:20 调试 brokerChannel-26 org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler 将消息转发到代理 2014-10-09 15:36:20 调试 reactor-tcp-io-2 org.springframework .messaging.simp.stomp.StompEncoder 编码 STOMP 命令=SEND headers={destination=[/topic/recieversdb755d e9-7a6e-47d2-a61d-5401cbe46301], content-type=[application/json;charset=UTF-8]}

我不断得到以下日志:

org.springframework.messaging.simp.stomp.StompDecoder 收到不完整的帧。重置缓冲区。

在网上找不到任何东西。任何帮助,将不胜感激。

0 投票
0 回答
443 浏览

java - Tomcat 8 和 Java Web 套接字 ClassCastException

我正在尝试在 Spring 4.0 Web 应用程序中实现以下 Websockets 示例:

http://spring.io/guides/gs/messaging-stomp-websocket/

我有以下配置文件:

这是我在客户端上使用的带有 SockJS 和 Stomp.js 的 JavaScript:

创建套接字连接后,我收到一个类转换异常,如下所示:

我在另一个 StackOverflow 问题上看到了同样的问题,不幸的是,该解决方案没有解决我的问题,因为我的 build.gradle 文件中没有包含 javax.websocket-api。我试过包括它和排除它,我得到了同样的错误。我正在使用 Tomcat 8.0.14。

注意:完全相同的代码库已经在 Tomcat 7 上使用 Java 7 进行了测试,并且可以正常工作。当我切换到 Java 8 并在 Tomcat 8 上运行它时,我得到了上面的异常。