问题标签 [jsr356]

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 回答
1710 浏览

java - Java websocket连接检查同一用户是否重新连接

在我的应用程序中,我有一个会话处理程序,它在连接时存储所有连接的会话,如果它们正确断开连接,则将它们删除。如果他们不这样做,我会保留会话,如果他们重新连接,我会用新会话替换旧会话。(下面的代码看起来很愚蠢,但这只是为了说明我的观点)

问题是:如何检查会话是否用于之前连接的客户端,以便我可以用新打开的会话替换会话?

编辑:这是必需的,因为我的客户端是一个 html5 应用程序,用户可以在其中刷新/导航页面,然后连接丢失。每当他尝试重新连接时,我都想知道他当前正在玩什么游戏。如果用户的连接不稳定(即在手机上),连接也会不时丢失。

0 投票
0 回答
388 浏览

javascript - WebSocket 关闭发送 Base64 编码字符串

我正在尝试通过 websocket 发送一个 base64 编码的字符串(从图像转换而来),这对我来说使用 javascript 客户端工作得很好。

但是,如果我改用 java 客户端 (@clientEndPoint),onMessage 函数会被触发一次,并且 websocket 连接会立即关闭。没有错误。

同样,我尝试从服务器发送纯字符串,并且 java 客户端正常运行。但只是不适用于 base64 编码的字符串。

我正在使用 Tomcat 7.0.69,以下是代码片段:

服务器端点:

Java客户端:

这里调用了一次句柄消息,并打印了相应的 sysout,然后立即调用 onClose。onError 永远不会被调用。

0 投票
0 回答
446 浏览

java-websocket - 相当于 websocket 的 404

我正在使用 websockets 将有关资源的信息从服务器传递到客户端。websocket Endpoint 使用路径参数来标识特定资源。例如:

onOpenEndpoint 类在其方法中具有以下逻辑:

使用 AJAX 长轮询时,如果资源不存在,我会发送 404 响应。然后客户就会知道不要再试了。是否有用于 websockets 的等效技术?我的两个想法是:

  1. if (!resourceExists)在上面的块中使用以下代码:

    session.close(new CloseReason(CUSTOM_NOT_FOUND_CODE, "Resource ID not found")); return;

    CUSTOM_NOT_FOUND_CODE4000-4999 范围内的 CloseCode 在哪里。

  2. 在此端点的实现中的某处执行此逻辑,ServerEndpointConfig.Configurator并在连接升级发生之前返回 404。这听起来对我来说是最好的方法,但似乎没有任何方法可以从该modifyHandshake方法发送标准的 HTTP 错误响应。

  3. 在过滤器中执行此逻辑。但是,这里的问题是,如果我在过滤器中加载资源,我如何将它传递给端点?使用 HTTP 请求,我可以在过滤器中添加请求属性,然后在 servlet 中可用。但是似乎没有一种简单的方法可以使用 websockets 实现相同的目标。当然,我可以在 Endpoint 类中再次加载资源,但这是重复工作。

我确信这一定是一个常见的场景,那么这里有公认的最佳实践方法吗?

0 投票
1 回答
464 浏览

tomcat - 对用 Java 编写的 Websocket 服务器和客户端端点之间交换的消息实施 gzip 压缩

关于如何使用 gzip 压缩传输消息,我没有看到有关 javax.websocket.Session 的 getBasicRemote() 和 getAsyncRemote() 的 sendText() 和 sendBinary() 方法的具体文档。我正在编写一个高性能的消息传递应用程序,它每秒可以在对等方之间发送数百条 1000 条消息。其中一些消息很小,一些消息很大,可以使用 gzip 压缩(减少 90% 的数据传输)。是否有任何特殊的扩展可用于在 Jetty 9 或任何其他容器中实现此按消息压缩工作?

注意:我不是在开发基于浏览器的 websocket 解决方案。客户端和服务器是严格的 Java 客户端,可以与任何 JSR-356 Websocket 容器实现一起使用。

0 投票
1 回答
163 浏览

java-websocket - Servlet 中使用的 Websocket,是否需要“public static void main(final String[] args)”?

这是我第一次使用 Java Websockets(不使用 Jetty,而是使用 JSR-356),我看到的所有示例都使用“public static void main(final String[] args)”来映射 Websocket 客户端和服务器端点。

如果我正在创建基于 Java Servlet 的应用程序,那么连接两个套接字端点是否需要该方法?如果有必要,那么它甚至如何被调用以在该连接类中执行该方法?

0 投票
0 回答
201 浏览

servlets - 如何将对象从 Servlet 传递到 JSR-356 WebSocket

我有一个 JSP 类型的 servlet,它向 Servlet 容器注册了一个 WebSocket 端点。

我想将该 servlet 和/或其某些对象的引用传递给 WebSocket 端点,以便我可以使用该 servlet 中的代码,例如用于身份验证或会话管理(该 servlet 有自己的非 Java EE会话管理)。

我希望在调用 addEndpoint() on 时可以在某处设置一些属性ServerContainer,因为那时我可以访问以后要使用的对象,但是我当时看到的所有类都没有属性集合,例如

当我的代码到达一个ServletRequestListenerServerEndpointConfig.Configurator或注册的端点时,我没有对添加端点的原始 servlet 的任何引用。

如何将对象传递给 WebSocket servlet?我在 Embedded Jetty 中运行我的测试代码,但我的目标是与容器无关的代码。

0 投票
2 回答
679 浏览

java - Undertow Websocket Bean 注入 CDI 问题

我不明白为什么 CDI 使用注入不适用于 websockets,使用 undertow。

下面是我为一个简单的 websocket 端点提供的代码。

当然问题是注入的属性为空。对于下面描述的无状态 bean 的部署和注入,我当然没有问题。有没有办法解决这个问题,如果我只是初始化我需要的 bean 属性,我可能会遇到什么问题?因为这绝对有效。

RetrieveAccessor retrieveAccessor = new.... {code}

0 投票
1 回答
1097 浏览

tomcat - Tomcat 上的 WebSocket 握手返回意外响应代码 500

我有一个 WebSocket 应用程序,它以编程方式注册端点,而不使用注释。

相关代码为:

当我在具有嵌入式 Jetty 容器的 IDE 中运行它时一切正常,其中依赖项是通过 Maven 对 tomcat-websocket 和 tomcat-websocket-api 库,但是当我将它部署在 Tomcat(8.5.5)中时,然后尝试要建立 WebSocket 连接,我在浏览器的控制台中收到以下错误:

WebSocket 连接到“ws://127.0.0.1:8080/echo”失败:WebSocket 握手期间出错:意外响应代码:500

我没有在 Catalina 输出中记录任何错误或其他信息,并且不确定如何调试此问题。

我需要以编程方式配置端点,因为很多信息在编译时是未知的,所以请不要将我指向 Annotation 解决方案。

我已将日志级别设置为 FINE,这是相关的片段:

0 投票
0 回答
478 浏览

amazon-web-services - Atmosphere.js 上的 Websockets 不断关闭,可能导致服务器停机

我们在 AWS ELB 上部署了一个 GWT 应用程序。我们正在使用 Atmosphere.js 和 websocket 设置以每秒获取 UI 的实时用户数量。我一直在 UI 上看到这个错误:

Websocket关闭,原因:连接异常关闭(即没有发送关闭帧)。- wasClean:假

在服务器端我看到

2017 年 2 月 2 日 09:27:08.486 严重 [http-nio-8080-exec-5] org.atmosphere.container.JSR356Endpoint.onError java.io.EOFException at org.apache.coyote.http11.upgrade.NioServletInputStream.doRead (NioServletInputStream.java:97) 在 org.apache.coyote.http11.upgrade.AbstractServletInputStream.read(AbstractServletInputStream.java:124) 在 org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:60) 在org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:198) 在 org.apache.coyote 的 org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:185)。 http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:96) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler。在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint. java:1476) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads .TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745)concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:第745章)concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:第745章)

编辑:监听器配置: 在此处输入图像描述

有时,当此页面上有很多活动时,服务器最终会崩溃。

我在服务器端看到的异常可能是什么原因?

0 投票
1 回答
1823 浏览

websocket - Websocket JSR-356 使用 Jetty 9.4.1 失败

我当前的 Web 服务器是嵌入式 Jetty 9.1.5。它适用于 JSR-356 来创建 websocket。这些天,我正在尝试升级到 Jetty 9.4.1。除了 websocket,一切都很好。
我的代码如下:

  1. 嵌入式 Jetty 和 Websocket 库:
  1. 服务器端点:
  1. Jetty 服务器、Webapp 上下文、Websocket 配置:

  2. 倾倒:

上面的代码适用于 Jetty 9.1.5.v20140505 和 Java 7,但是当我升级到 Jetty 9.4.1.v20170120 和 Java 8 时失败。浏览器控制台报告 404 错误。

升级 Jetty 时我错过了什么吗?
提前致谢。