WebSocket客户端在连接时关闭

托马斯·山卡蒂斯

我试图在Java中构建一个独立的WebSocket客户端,该客户端连接到C#中的WebSocket服务器。我正在使用为WebSocket服务器生成的自签名证书。我可以使用WSS在Chrome浏览器中连接到WebSocket服务器,而不会出现任何问题。尝试使用TooTallNate / Java-WebSocket库时,它不起作用。连接时会立即调用OnClose方法。

我在用于C#服务器的* .pfx文件中有一个自签名证书,该证书已导入到我的受信任的根存储中。我使用keytool从该文件中创建了一个* .jks(我想我已经正确地做到了)。我正在使用由keytool在我的代码中生成的keystore.jks。

这是我的主要方法:

public static void main(String[] args) throws Exception {
    ChatClient chatclient = new ChatClient("wss://thomas.localnetwork.com:65120/wsserver?userId=Thomas", "Thomas", "1", "1", "L");
    // load up the key store
    String STORETYPE = "JKS";
    String KEYSTORE = "C:\\Users\\thomas\\Desktop\\keystore.jks";
    String STOREPASSWORD = "test12345";
    String KEYPASSWORD = "test";

    KeyStore ks = KeyStore.getInstance( STORETYPE );
    File kf = new File( KEYSTORE );
    ks.load( new FileInputStream( kf ), STOREPASSWORD.toCharArray() );

    KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
    kmf.init( ks, KEYPASSWORD.toCharArray() );
    TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
    tmf.init( ks );

    SSLContext sslContext = null;
    sslContext = SSLContext.getInstance( "TLS" );
    sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null );
    // sslContext.init( null, null, null ); // will use java's default key and trust store which is sufficient unless you deal with self-signed certificates

    SSLSocketFactory factory = sslContext.getSocketFactory();// (SSLSocketFactory) SSLSocketFactory.getDefault();

    chatclient.setSocketFactory( factory );

    chatclient.connectBlocking();

    BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );
    while ( true ) {
        String line = reader.readLine();
        if( line.equals( "close" ) ) {
            chatclient.closeBlocking();
        } else if ( line.equals( "open" ) ) {
            chatclient.reconnect();
        } else {
            ucm.send( line );
        }
    }
}

这是我收到的异常:

Closed connection on wss://laptop-thomas.compuflex1.com:65120/wsucm_deviceagent?userId=Thomas
javax.net.ssl.SSLException: java.net.SocketException: Connection reset
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1906)
    at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1870)
    at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1815)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:116)
    at java.io.InputStream.read(InputStream.java:101)
    at org.java_websocket.client.WebSocketClient.run(WebSocketClient.java:424)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
    at sun.security.ssl.InputRecord.read(InputRecord.java:503)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:928)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
    ... 3 more

有什么办法可以获取有关握手的更多详细信息或实际问题是什么?异常堆栈跟踪似乎根本没有帮助。

托马斯·山卡蒂斯

我的问题是我的本地防火墙引起了问题。我还发现我可以将证书安装到Java的受信任的根存储中。

请注意,每个Java版本(JDK和JRE)都有自己的“证书”文件。确保为您的开发或运行时环境安装正确的版本。我之所以撞墙是因为直到我意识到这一点,它才在IntelliJ中起作用。

  1. 将证书安装到JVM受信任的根存储
  2. 检查是否已正确安装
  3. 删除代码的密钥库部分

这是将证书安装到正确位置后对我的代码所做的更改。

public static void main(String[] args) throws Exception {
    ChatClient chatclient = new ChatClient("wss://thomas.localnetwork.com:65120/wsserver?userId=Thomas", "Thomas", "1", "1", "L");

    chatclient.connectBlocking();

    BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );
    while ( true ) {
        String line = reader.readLine();
        if( line.equals( "close" ) ) {
            chatclient.closeBlocking();
        } else if ( line.equals( "open" ) ) {
            chatclient.reconnect();
        } else {
            chatclient.send( line );
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Golang WebSocket客户端,获取结果后关闭连接

关闭客户端时SignalR Websocket异常

websocket客户端在发送大数据时断开连接

http客户端关闭连接时如何存储响应?

Jersey客户端是否在发生异常时关闭连接?

检查客户端是否关闭连接时,reset()出错

客户端 websocket 通过代理连接

WebSocket / REST:客户端连接?

如何关闭WCF客户端连接

检测客户端关闭连接Blazor

ws4py.websocket:来自客户端的长时间延迟关闭连接

nginx错误-等待请求时客户端关闭连接,客户端:xxxx,服务器:0.0.0.0:80

使用 websocket 连接的客户端连接到 memcached

关闭客户端

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

为什么服务器在关闭客户端连接时进入无限循环

当客户端关闭连接时,Go http.ResponseWriter.Write 不会返回错误

客户端关闭连接时,Spring StreamingResponseBody请求线程未清理

骆驼:与外部客户端的连接意外关闭时,对路由执行的影响

XMPP:BOSH客户端会话在连接到Openfire时随机关闭

当我无权访问服务器时,如何从客户端关闭套接字连接?

客户端关闭连接时在服务器上多次调用NetworkStream回调

Akka HTTP客户端Websocket意外关闭

当websocket客户端太慢时,websocket将如何工作?

Spring Websocket-如何检测客户端断开连接

Java中的简单Websocket客户端-连接问题

在Spring Boot中编写客户端以连接到Websocket

Ktor websocket 客户端连接多个服务器

Ktor Android 客户端 Websocket 连接失败