首先,对不起我的英语,但也许我可以帮助你,即使这个问题是四年前的,也许有人会遇到同样的问题。
开始了..
如果您使用例如"ws://localhost:8025"
Java websocket 将无法建立安全连接,请查看文档。
Websocket 只会在结合 SSL 的情况下创建安全连接。最后你将使用"wss://localhost:8025"
.
让我们添加 SSL:
首先,您将需要一个会话密钥。您可以在 JavaJDK 文件夹(例如C:\Program Files\Java\jdk1.8.0_191\bin\keytool.exe)中找到一个名为"keytool.exe"的文件。这个小工具将生成一个会话密钥,该密钥应保存在客户端和服务器端。
现在使用该工具。例如:
keytool -genkey -keyalg RSA -validity 3650 -keystore "keystore.jks" -storepass "storepassword" -keypass "keypassword" -alias "default" -dname "CN=127.0.0.1, OU=MyOrgUnit, O=MyOrg, L=MyCity, S=MyRegion, C=MyCountry"
我从以下位置复制了上面的示例:
https://github.com/TooTallNate/Java-WebSocket/blob/master/src/main/example/SSLClientExample.java
现在您可以从名为“KEYSTORE”的特定文件中加载会话密钥。
KeyStore ks = KeyStore.getInstance( STORETYPE );
File kf = new File( KEYSTORE );
ks.load( new FileInputStream( kf ), STOREPASSWORD.toCharArray());
您需要生成一个密钥管理器和一个信任管理器。作者使用了“SunX509”协议。
KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
kmf.init( ks, KEYPASSWORD.toCharArray() );
TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
tmf.init( ks );
之后,是时候获取“真正的”SSL 上下文了。您需要加载 TLS 协议。SSL 和 TLS 几乎相同。当您生成一个 ssl-socket 时,您可以创建一个使用 ssl/tls 的新套接字。
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
例如:我一开始用的
Session session = new Session(new Uri("wss://localhost:8025"));
我的Session.class 从 WebSocketClient 扩展。因此我可以使用:
session.setSocket(sslSocketFactory.createSocket());
session.connect();
注意:如果要使用“wss”,则必须实现 SSL 或不使用 SSL 的“ws”。
那么您的代码可能有什么问题?
-> 你没有在服务器端实现 SSL,所以它会拒绝连接
该代码完美运行,我确实对其进行了测试。我只为客户端发布,但服务器端将是相同的代码:)
我希望到目前为止我能帮助你。