Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用安全连接时Jetty 9 WebSocket客户端问题_Java_Websocket_Jetty - Fatal编程技术网

Java 使用安全连接时Jetty 9 WebSocket客户端问题

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

我正在使用Jetty 9.4.18库在java应用程序中编写WebSocket客户端

我对websocket非常陌生,所以我开始使用Jetty文档中的两个示例类进行测试,连接到
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
只使用了几年前被弃用的非常弱的密码套件