为了账号安全,请及时绑定邮箱和手机立即绑定

WebSocket 客户端关闭连接

WebSocket 客户端关闭连接

回首忆惘然 2023-10-12 17:33:50
我正在尝试用 Java 构建一个独立的 WebSocket 客户端,该客户端连接到 C# 中的 WebSocket 服务器。我正在使用为 WebSocket 服务器生成的自签名证书。我可以使用 WSS 连接到 Chrome 浏览器中的 WebSocket 服务器,没有任何问题。当尝试使用TooTallNate/Java-WebSocket库时,它不起作用。连接后立即调用 OnClose 方法。我在生成的 *.pfx 文件中拥有一个自签名证书,用于 C# 服务器并导入到我的受信任根存储中。我使用 keytool 从该文件创建了 *.jks (我认为我已经正确完成了此操作)。我正在使用 keystore.jks,它是由 keytool 在我的代码中生成的。这是我的主要方法: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 );        }    }}有什么方法可以让我获得有关握手的更多详细信息或实际问题是什么?异常堆栈跟踪似乎根本没有帮助。
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

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

请注意,每个 Java 版本(JDK 和 JRE)都有自己的“cacerts”文件。请务必安装到适合您的开发或运行时环境的正确版本。我一直在用头撞墙,因为它在 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 );

        }

    }

}


查看完整回答
反对 回复 2023-10-12
  • 1 回答
  • 0 关注
  • 51 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信