首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WebSocket客户端关闭连接

WebSocket客户端关闭连接
EN

Stack Overflow用户
提问于 2019-10-10 16:42:21
回答 1查看 557关注 0票数 0

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

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

以下是我的主要方法:

代码语言:javascript
运行
复制
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 );
        }
    }
}

以下是我收到的例外情况:

代码语言:javascript
运行
复制
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

有没有办法让我了解更多关于握手的细节或者实际问题是什么?异常堆栈跟踪似乎毫无帮助。

EN

Stack Overflow用户

回答已采纳

发布于 2019-10-11 14:23:31

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

请注意,每个Java版本(JDK和JRE)都有自己的“仙人掌”文件。确保为您的开发或运行时环境安装到正确的。我的头撞在墙上,因为它在IntelliJ工作,直到我意识到这一点。

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

下面是在将证书安装到正确位置后对我的代码的更改。

代码语言:javascript
运行
复制
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 );
        }
    }
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58327541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档