问题标签 [tyrus]

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

multithreading - ServerEndpoint 的每个方法都是由不同的线程执行的吗?

我使用 GF 4 作为 JavaEE 服务器。

这就是我对 servlet 处理的理解:有一个线程池,当请求来自该池时,将采用一个线程来处理请求。之后,线程被放回池中。

根据上面的信息,我想(我不确定)websockets(服务器端点)是这样处理的:有线程池,当

  • 客户端创建新的 websocket,从池中获取一个线程来创建 ServerEndpoint 的新实例并执行 @OnOpen 方法。在该线程被放回池之后。
  • 客户端通过 websocket 向服务器发送消息。从池中取出线程来执行@OnMessage 方法。在该线程被放回池之后。
  • 客户端关闭 websocket - 从池中获取线程以执行 @OnClose 方法。在该线程被放回池之后。

这一切都意味着 ServerEndpoint 的每个方法都可以由不同的线程执行。我的理解对吗?

0 投票
2 回答
2499 浏览

jakarta-ee - javax.websocket.Session.isOpen() 方法是如何工作的?

假设我们在客户端和 javaee 服务器之间打开了 websocket。有一个方法 session.isOpen() 可以用来检查会话是否仍然打开。但是什么会返回这个方法以及为什么如果客户端计算机突然关闭或用户离开页面但我们的 js 脚本没有关闭连接。这种方法的可靠性如何?

0 投票
1 回答
1289 浏览

java - 启动 tyrus 独立服务器时出现 ClassNotFoundException

我在server.start()通话时收到以下错误:

我也找不到 maven 依赖项GrizzlyServerContainer

有任何想法吗?这是我的代码:

Maven 依赖项

0 投票
0 回答
1295 浏览

java - javax.websocket 库出错

我只是按照这里的例子:javax.websocket client simple example

我的 Maven 存储库如下所示:

但我无法理解错误信息:

问题是什么?

0 投票
1 回答
1214 浏览

java - 是否可以使用 SSL 运行独立的 Tyrus websocket 服务器?

我有一个运行本地 websocket 服务器的 java web start 应用程序。这个应用程序接收一些数据,对这些数据进行签名,并通过 websocket 连接将签名数据返回给浏览器。我使用 Tyrus 容器作为我的本地 websocket 服务器。最近我发现自己卡住了:浏览器尝试在 ssl 上下文中建立到 ws 的连接,但我的 ws 服务器不支持安全的 websocket 连接。

我收到以下错误:

混合内容:“ https://example.com ”上的页面是通过 HTTPS 加载的,但尝试连接到不安全的 WebSocket 端点“ws://localhost:8025/sign/”。此请求已被阻止;此端点必须在 WSS 上可用。

未捕获的安全错误:无法构造“WebSocket”:可能无法从通过 HTTPS 加载的页面启动不安全的 WebSocket 连接。

换句话说,Tyrus 没有给我这样的东西:

有没有一种方法可以让我使用 SSL 运行 Tyrus Server,或者有人知道另一个自包含的 websocket 服务器吗?

提前致谢

0 投票
1 回答
758 浏览

java - Tyrus websocket 客户端 @OnMessage 从未调用过 - Storj 开源项目

我正在开发一个开源项目 Storj。我正在编写一个连接到 Node.js websocket 后端的 Java 客户端。客户使用 Tyrus。沟通应该如下:

  • 连接
  • 客户端发送身份验证令牌(文本)。
  • 服务器发回一个文件(二进制)。
  • 服务器关闭连接。

我遇到了问题,因为我的 @OnMessage 永远不会被调用。我已经尝试使用一个简单的 javascript 客户端在线访问相同的 URL 和相同的令牌: https ://www.websocket.org/echo.html

我确实得到了使用这个的响应,它告诉我 Java 项目有问题。

在能够下载文件之前,在较早的阶段,我可以毫无问题地上传文件。但是,该步骤不需要调用@OnMessage(它只是上传文件,然后服务器会断开一条消息),所以我不确定我的@OnMessage 是否正常工作。

以下是 Websocket 的相关代码(也可在 Github 上找到): https ://github.com/NutterzUK/storj-java-bridge-client/blob/master/storj-client/src/main/java/storj/io /client/websockets/WebsocketFileRetriever.java

以及启动此 websocket 的代码,可在此处获得 https://github.com/NutterzUK/storj-java-bridge-client/blob/master/storj-client/src/main/java/storj/io/client/DefaultStorjClient .java

我也尝试将 Tyrus 升级到最新版本,我得到了相同的结果。有任何想法吗?

这段代码的输出是:

发送消息后,它会在来自@OnClose 的“NORMAL_CLOSURE”消息之前挂起一段时间。

更新:运行它以重现问题的一种非常简单的方法

我已经在 git 存储库中添加了一个测试用户名和密码,所以可用的代码在这里:https ://github.com/NutterzUK/storj-java-bridge-client

要运行它,你只需要运行 storj.io.client.main.MainTest

快速浏览它的功能。它首先会发送一些 HTTP 请求以获取令牌。它将使用该令牌通过 websocket 连接到某人的机器,并将该令牌作为文本发送。作为响应,它应该以字节形式接收文件。

在连接之前,它会打印出令牌和要连接的地址。它会在关闭之前挂起一段时间,并且不会调用任何 onMessage 方法。为了进行测试,如果您将 System.exit 放在那里(在 DefaultStorjClient.java 中取消注释第 152 行),它将无法连接,因此您可以在另一个客户端中使用该令牌。我已经使用https://www.websocket.org/echo.html进行了测试(确保您的浏览器将允许不安全的 URL,因为它不是“wss”,要在 Chrome 中执行此操作,您需要单击顶部的盾牌对。我可以看到服务器确实响应: 显示正在接收的 blob 的图像

这表明确实发送了一个 blob 作为对文本消息的响应,但 Tyrus 中的 @OnMessage 从未被触发。

0 投票
2 回答
1272 浏览

java - OSGI 中的 Websocket 客户端

我目前已经使用 tyrus 客户端实现了 websocket 客户端,并且 websockets 客户端在 OSGI 环境之外可以正常工作。

问题是 websocket 不能在 apache karaf 上运行。我已经安装了 websocket 客户端的所有依赖项。列表是

tyrus 客户端通过 ServiceLoader 提供实现。所以我正在使用 Apache Aries SPI Fly Dynamic Weaving Bundle 来实现。但我仍然得到找不到实现类。错误。

经过调查,我发现 tyrus 客户端没有添加

到需要通知处理包有关正在提供的服务的清单。在我的 rna-websocket-client 包中,我添加了

这将需要通知 aries 动态编织包我们使用 javax.websocket.ContainerProvider 服务。

这是在 OSGI 中运行 websocket 的正确方法还是在 OSGI 中运行 websocket 的其他方法?关于这个问题的任何见解都会非常有帮助。

0 投票
1 回答
1757 浏览

tomcat - Tomcat 8 和非 Atmosphere 客户端的 Atmosphere+Jersey 错误

我运行一个聊天服务器,它使用 Atmosphere 作为 websocket 支持的框架。Atmosphere 使用 Jersey 是因为我使用了大气-jersey maven 依赖项。

聊天服务器在 Tomcat 7 上运行,我们正在升级到 Tomcat 8。

我们的一位客户使用 Tyrus 作为他们的 Java websocket API。

当我们的聊天服务器部署在 Tomcat 7(使用 Java 6、7 或 8)上时,没有任何问题。

使用我们在 Tomcat 8 (Java 8) 上的聊天服务器,我们使用 Atmosphere 的测试客户端可以正常工作,但使用 Tyrus 的客户端不能。我们看到的错误是:

发生这种情况是因为在 Tomcat 7 中,来自 websocket 请求的请求 URL 被视为类似于“http://localhost:8080/chat/”(向 ws://localhost:8080/chat/ 发出请求,但它已更改到 http:// 某处)。但是对于 Tomcat 8,来自 websocket 请求的请求 URL 类似于“/chat/”,并且架构不存在,Jersey 会抛出错误。

为了解决这个问题,当 Atmosphere 客户端发出请求时,Atmosphere 会查找具有模式的标头“origin”。但是当 Tyrus 客户端发出请求时,“origin”标头不包含 http 模式,从而导致上面显示的错误。

我想知道是否有人对这个简单的解决方案有任何想法,或者遇到过类似的问题。我已经做了很多寻找一个简单的解决方案,但还没有找到一个。没有它,我们正在考虑停止使用 Atmosphere 并使用其他需要大量代码重构的东西。

这些是围绕此问题的票证/错误的一些链接,似乎已经解决了这个问题,但我有正确的版本并且仍然存在问题。

https://bz.apache.org/bugzilla/show_bug.cgi?id=56573 https://github.com/Atmosphere/atmosphere/issues/1839

大气版本:2.4.8

球衣版本(通过大气):1.19

泰鲁斯版本:1.13

0 投票
1 回答
2340 浏览

servlets - Weblogic 12.2.1.2 - websocket 端点 - 此请求禁用异步支持

对于我即将提出的问题,我已经有了答案。

在任何情况下,我都在这里问它,以便它可以帮助人们从 JEE 6 迁移到 JEE 7 并且正在考虑使用 websocket - 例如用 websocket 功能代替长轮询。

问题:在支持 JEE 7 的 Weblogic 12.2.1.2 中,并尝试使用如下指南设置 websocket: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/HomeWebsocket/WebsocketHome。 html

注意:上面的指南非常简单,它所说的都是正确的并且“应该”工作。不一定适用于您的应用程序,因为它没有在我的应用程序中。但在概念上它应该。

尽管那样。在从浏览器到支持的握手期间,websocket 应用程序出错,其中 HTTP 连接应该升级为 tcp/ip Web 套接字连接。

Weblogic,抱怨 tyrus 不能使用 Ascyn servlet 行为来处理这个握手协议。下面列出了握手期间错误的堆栈跟踪:

2017-01-23 14:54:59,065 ThreadId:53 错误 HTTP - [ServletContext@129852715[app:primefaces-60 模块:primefaces-60

path:null spec-version:3.1]] Servlet 失败并出现异常 <[ACTIVE] ExecuteThread: '5' for queue: 'weblogic.kernel.Default (self-tuning)'> java.lang.IllegalStateException: 异步支持对此请求禁用:weblogic.servlet.internal.ServletRequestImpl@2c87c663[ GET /primefaces-60/actions HTTP/1.1 连接:升级编译指示:无缓存缓存控制:无缓存升级:websocket 来源: http://本地主机:7001Sec-WebSocket-Version: 13 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 DNT: 1 Accept-Encoding: gzip, deflate, sdch , br Accept-Language: en-US,en;q=0.8,pt-PT;q=0.6,pt;q=0.4,fr;q=0.2,it;q=0.2,de;q=0.2 Sec-WebSocket -Key:flKcAkxO3CJBIc8cYvwvlA== Sec-WebSocket-Extensions:permessage-deflate;client_max_window_bits

] 在 weblogic.servlet.internal.ServletRequestImpl.startAsync(ServletRequestImpl.java:2029) 在 weblogic.servlet.internal.ServletRequestImpl.startAsync(ServletRequestImpl.java:2005) 在 javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:432)在 weblogic.websocket.tyrus.TyrusServletFilter.doFilter(TyrusServletFilter.java:241) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) 在 filter.DummyTimeoutFilter2.doFilter(DummyTimeoutFilter2.java:81) 在 weblogic。 servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) 在 weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:32) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) 在 weblogic .servlet.内部。WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3683) 在 weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3649) 在 weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326)在 weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197) 在 weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203) 在 weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71 ) 在 weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2281) 在 weblogic.servlet.internal.WebAppServletContext 的 weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2433)。在 weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1651) 在 weblogic.servlet.provider.ContainerSupportProviderImpl 在 weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1691) 处执行(WebAppServletContext.java:2259) $WlsRequestExecutor.run(ContainerSupportProviderImpl.java:270) 在 weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348) 在 weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333) 在 weblogic.work.LivePartitionUtility.doRunWorkUnderContext( LivePartitionUtility.java:54) 在 weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41) 在 weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:第640章)

基于设置 websocket 端点的后端代码是完美的假设,用于尝试建立 websocket 连接的 javascript 代码是完美的。有人可以按照信中的指南解释为什么会出现上述错误吗?

注意: - 根据对真实应用程序的分析,上述堆栈跟踪已在示例应用程序中隔离,该示例应用程序具有工作的 websocket 端点已损坏为上述异常。

一旦你知道答案很简单......如果没有人支持正确的解决方案,我将在一天左右的时间内回答。

0 投票
1 回答
606 浏览

java - Tyrus - Store messages received by client

I want to have a client which will receive WS messages and store them for further analysis.

I created a Client based on https://dzone.com/articles/sample-java-web-socket-client

Unfortunately on each onMessage method call the field which will store the values is null and message cannot be added.

Code

Log