- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Jetty 的 WebSocket 客户端,但应用程序只会卡在那里,不会退出。没什么好看的...
public class TestEndPoint extends Endpoint {
private Session sess;
public TestEndPoint(URI endpoint) throws Exception {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.connectToServer(this, endpoint);
}
public void close() {
try {
this.sess.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
...
}
我正在将它连接到我的 PHP Ratchet WS,没有什么特别的,没有特殊的逻辑,我只是在客户端连接时打印出 open
并在客户端断开连接时打印出 close
。
然后我这样运行它:
public static void main(String[] args) {
try {
TestEndPoint test = new TestEndPoint(new URI("ws://localhost:8080/test"));
Thread.sleep(5000);
test.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
我可以看到我的 WS 会打印“关闭”,但是 Java 应用程序永远不会退出。所以我做了一个线程转储,看到 jetty
的东西卡在了一些 QueuedThreadPool
...
一些线程转储:
"WebSocketContainer@1735934726-15" #15 daemon prio=5 os_prio=0 tid=0x0000000016cdf000 nid=0x1c5c runnable [0x000000001763e000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(WindowsSelectorImpl.java:296)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(WindowsSelectorImpl.java:278)
at sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:159)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x00000000ebf678c8> (a sun.nio.ch.Util$3)
- locked <0x00000000ebf68128> (a java.util.Collections$UnmodifiableSet)
- locked <0x00000000ebf67d40> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.select(ManagedSelector.java:346)
at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.produce(ManagedSelector.java:299)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:179)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:243)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:679)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:597)
at java.lang.Thread.run(Thread.java:748)
"WebSocketContainer@1735934726-14" #14 daemon prio=5 os_prio=0 tid=0x0000000016cc7000 nid=0xfb4 waiting on condition [0x000000001753f000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000ebde1df8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:392)
at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:571)
at org.eclipse.jetty.util.thread.QueuedThreadPool.access$800(QueuedThreadPool.java:50)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:634)
at java.lang.Thread.run(Thread.java:748)
最后,我在我的 Gradle 中使用了这些版本的 Jetty
;
compile group: 'org.eclipse.jetty.websocket', name: 'websocket-api', version: '9.4.6.v20170531'
compile group: 'org.eclipse.jetty.websocket', name: 'websocket-client', version: '9.4.6.v20170531'
compile group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-client-impl', version: '9.4.7.v20170914'
关闭网络套接字或客户端的正确方法是什么?
最佳答案
经过多次谷歌搜索和查看许多示例代码后,您似乎需要通过将 WebSocketContainer
强制转换为 org.eclipse.jetty 来手动
!停止
.util.component.LifeCycle
为了停止 Jetty 的 WebSocket 客户端,您需要通过 Session
或 WebSocketContainer
本身执行以下操作。所以在我的 close
函数中:
try {
Session sess = getSession();
WebSocketContainer container = sess.getContainer();
// Need to cast the container to Jetty's LifeCycle
if(container != null && container instanceof LifeCycle) {
Logger.debug("Stopping Jetty's WebSocket Client");
((LifeCycle) container).stop();
}
sess.close();
} catch (Exception e) {
Logger.error(e);
}
在 Jetty 的网站上也没有文档 ( http://www.eclipse.org/jetty/documentation/9.4.7.v20170914/ )
关于java - 在 Java 中如何关闭 WebSocketContainer/WebSocketClient/Jetty 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46450721/
我正在审查服务器和客户端的一些 WebSocket 实现。 Alchemy WebSocketClient 是否应该能够连接到 ws://echo.websocket.org? WebSocketCl
我正在使用 org.java_websocket.client.WebSocketClient 从 Android 连接到服务器。一切都按预期工作,除非消息超过特定大小时。有谁知道您是否可以增加默认的
我正在编写一个程序(实际上是 Unity 中的一个游戏),它应该充当一个单独启动并运行的 Websocket 服务器的客户端。 我正在使用 System.Net.Websockets ClientWe
我是 stackoverflow 新手。 我目前正在开发一个 WebSocket 项目,并使用一个名为 Alchemy-Websockets 的组件。 我的问题是当我尝试像这样使用 Alchemy.W
我有一个连接到 websocket 端点的 Spring 应用程序。为此,我使用 Spring StandardWebSocketClient 类。 WebSocketClient transport
我正在使用 Spring WebFlux WebSocketClient 来订阅和处理来自远程 Web 套接字的消息。在处理来自远程套接字的消息 Flux 有时会意外完成(或因错误而终止),从而导致
我用我的 websocket 客户端连接到非 SSL 端点,没有任何问题。但是我找不到如何连接到 wss (SSL) 端点的任何方法。我在哪里可以定义 SSL 工厂等。似乎没有对象具有相关的 set
我正在尝试为 cometD 创建一个没有参数构造函数的新 WebSocketClient: static BayeuxClient newInstace(String url) throws Exce
我需要连接到支持 SNI 的 spring websocket 服务器。我正在使用默认情况下不发送 SNI 扩展的 Spring WebSocket 客户端,因为 jdk 1.8.0 默认不发送 SN
我有一个在嵌入式 jetty (8.1.8.v20121106) 中运行的 WebSocket 服务器,我想从另一个带有 jetty WebSocketClient 的 Java 应用程序连接到它。这
我有两个 C# 程序应该通过 WebSockets 进行通信,服务器工作正常(也使用 Alchemy)并且已经有一段时间了(使用 javascript 客户端)。然而连接炼金术WebSocketCli
本文整理了Java中io.undertow.websockets.client.WebSocketClient.connectionBuilder()方法的一些代码示例,展示了WebSocketCli
本文整理了Java中io.undertow.websockets.client.WebSocketClient.connect()方法的一些代码示例,展示了WebSocketClient.connec
我正在编写一个桌面 Java 应用程序作为 Web 服务客户端。我想使用 WebSocket 来实现来自服务器的通知“回调”。 我正在使用 Spring 框架的 WebSocketStompClien
我已经按照 this 在 .net 核心中构建了一个 WebSocket Web 应用程序和 this或 this教程。现在我正在尝试使用 Microsoft.AspNetCore.TestHost
我有一个问题,如有任何帮助,我们将不胜感激。我的测试设备是 ASUS Nexus 7 Android 5.1。我想使用 Jetty Websockets 连接到网络服务器。该 url 使用 wss,我
TL; 博士; 我们正在尝试使用 spring webflux WebSocket 实现设计一个 WebSocket 服务器。服务器具有通常的 HTTP 服务器操作,例如create/fetch/up
本文整理了Java中org.springframework.web.socket.client.WebSocketClient.doHandshake()方法的一些代码示例,展示了WebSocketC
我正在尝试使用 jetty 构建服务器客户端应用程序。我已经设置了一个jetty服务器并配置了websockets。在客户端和服务器之间发送文本消息工作正常。但是如何从客户端端点发送二进制数据作为输入
我正在尝试使用 Jetty 的 WebSocket 客户端,但应用程序只会卡在那里,不会退出。没什么好看的... public class TestEndPoint extends Endpoint
我是一名优秀的程序员,十分优秀!