Java 使用安全连接时Jetty 9 WebSocket客户端问题
我正在使用Jetty 9.4.18库在java应用程序中编写WebSocket客户端 我对websocket非常陌生,所以我开始使用Jetty文档中的两个示例类进行测试,连接到Java 使用安全连接时Jetty 9 WebSocket客户端问题,java,websocket,jetty,Java,Websocket,Jetty,我正在使用Jetty 9.4.18库在java应用程序中编写WebSocket客户端 我对websocket非常陌生,所以我开始使用Jetty文档中的两个示例类进行测试,连接到echo.websocket.org 当我在没有SSL的情况下连接时,测试可以正常运行,但是当连接到wss://echo.websocket.org 我总是得到同样的例外: java.io.EOFException: HttpConnectionOverHTTP@50371e9d::DecryptedEndPoint@6d
echo.websocket.org
当我在没有SSL的情况下连接时,测试可以正常运行,但是当连接到wss://echo.websocket.org
我总是得到同样的例外:
java.io.EOFException: HttpConnectionOverHTTP@50371e9d::DecryptedEndPoint@6dc65fc2{echo.websocket.org/174.129.224.73:443<->/192.168.1.34:60521,OPEN,fill=-,flush=C,to=226/0}
at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.earlyEOF(HttpReceiverOverHTTP.java:338)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1551)
at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.shutdown(HttpReceiverOverHTTP.java:209)
at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.process(HttpReceiverOverHTTP.java:147)
at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.receive(HttpReceiverOverHTTP.java:73)
at org.eclipse.jetty.client.http.HttpChannelOverHTTP.receive(HttpChannelOverHTTP.java:133)
at org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onFillable(HttpConnectionOverHTTP.java:155)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:411)
at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:305)
at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:159)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
at java.lang.Thread.run(Thread.java:748)
java.io.EOFException:HttpConnectionOverHTTP@50371e9d::DecryptedEndPoint@6dc65fc2{echo.websocket.org/174.129.224.73:443/192.168.1.34:60521,OPEN,fill=-,flush=C,to=226/0}
位于org.eclipse.jetty.client.http.HttpReceiverOverHTTP.earlyEOF(HttpReceiverOverHTTP.java:338)
http.HttpParser.parseNext(HttpParser.java:1551)
位于org.eclipse.jetty.client.http.HttpReceiverOverHTTP.shutdown(HttpReceiverOverHTTP.java:209)
位于org.eclipse.jetty.client.http.HttpReceiverOverHTTP.process(HttpReceiverOverHTTP.java:147)
位于org.eclipse.jetty.client.http.HttpReceiverOverHTTP.receive(HttpReceiverOverHTTP.java:73)
位于org.eclipse.jetty.client.http.HttpChannelOverHTTP.receive(HttpChannelOverHTTP.java:133)
位于org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onFillable(HttpConnectionOverHTTP.java:155)
位于org.eclipse.jetty.io.AbstractConnection$ReadCallback.successed(AbstractConnection.java:305)
位于org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
位于org.eclipse.jetty.io.ssl.SslConnection$decryptedpoint.onFillable(SslConnection.java:411)
位于org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:305)
位于org.eclipse.jetty.io.ssl.SslConnection$2.successed(SslConnection.java:159)
位于org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
位于org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
位于org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
位于org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
运行(Thread.java:748)
看起来服务器关闭时没有响应握手请求
我知道SslContextFactory,但我的理解是,只有在您需要自己的信任库或密钥库时,或者在其他特殊情况下,才应该使用它
还请注意,在一些失败的尝试之后,我从下载了另一个websocket实现,它可以很好地与ws和wss一起工作,而无需设置任何特定于SSL的内容。
然而,对于这个项目,我必须使用Jetty
我使用的代码正是Jetty文档中的示例
我所做的唯一更改是向SimpleEchoSocket添加一个OneError方法,该方法转储整个异常堆栈
我错过什么了吗
提前谢谢 不幸的是,
websocket.org
(和Kaazing主机/代理)此时存在一系列TLS问题,因此使用其公共服务器目前不是明智的选择
这里是一个不同的演示,也使用TLS和WebSocket,针对一个具有正确和健全的TLS/SSL实现的stackexchange服务器
这是针对Jetty 9.4.18.v20190429编写的
package org.eclipse.jetty.demo;
导入java.net.URI;
导入java.util.concurrent.Future;
导入org.eclipse.jetty.client.HttpClient;
导入org.eclipse.jetty.util.component.LifeCycle;
导入org.eclipse.jetty.util.log.log;
导入org.eclipse.jetty.util.log.Logger;
导入org.eclipse.jetty.util.ssl.SslContextFactory;
导入org.eclipse.jetty.websocket.api.Session;
导入org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
导入org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
导入org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
导入org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
导入org.eclipse.jetty.websocket.api.annotations.websocket;
导入org.eclipse.jetty.websocket.client.WebSocketClient;
@网袋
公共类SecureClientSocket
{
私有静态最终记录器LOG=LOG.getLogger(SecureClientSocket.class);
公共静态void main(字符串[]args)
{
字符串url=”wss://qa.sockets.stackexchange.com/";
SslContextFactory ssl=新的SslContextFactory.Client();
ssl.setEndpointIdentificationAlgorithm(“HTTPS”);
HttpClient http=新的HttpClient(ssl);
WebSocketClient=新的WebSocketClient(http);
尝试
{
http.start();
client.start();
SecureClientSocket=新SecureClientSocket();
Future fut=client.connect(socket,URI.create(url));
Session=fut.get();
session.getRemote().sendString(“Hello”);
session.getRemote().sendString(“155个问题处于活动状态”);
}
捕获(可丢弃的t)
{
LOG.warn(t);
}
最后
{
停止(http);
停止(客户);
}
}
专用静态无效停止(生命周期)
{
尝试
{
lifeCycle.stop();
}
捕获(例外e)
{
e、 printStackTrace();
}
}
@OnWebSocketConnect
公共连接无效(会话sess)
{
LOG.info(“onConnect({})”,sess;
}
@OnWebSocketClose
public void onClose(int statusCode,字符串原因)
{
LOG.info(“onClose({},{})”,状态码,原因;
}
@OnWebSocketError
公共无效申报人(可撤销原因)
{
日志、警告(原因);
}
@OnWebSocketMessage
公共消息无效(字符串消息)
{
LOG.info(“onMessage()-{}”,msg);
}
}
您的问题让我添加了一个使用wss://echo.websocket.org/
(它失败的原因是,echo.websocket.org
只使用了几年前被弃用的非常弱的密码套件