spring引导套接字io客户端v1不使用ssl发送到socket.io服务器

cwdobuhd  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(420)

我们使用的是socket.io服务器v2.3.0,没有ssl。js前端客户端和spring引导客户端使用socket.io服务器发送和接收消息。
现在,我们正在使用ssl。js前端工作正常,但spring引导客户端不会向socket.io服务器发送任何消息。这是我向socket.io服务器发送消息的源代码。它在没有ssl的情况下工作。我更改了url并为此设置了https。

  1. IO.Options options = new IO.Options();
  2. options.transports = new String[]{"websocket"};
  3. options.reconnectionAttempts = 2;
  4. options.reconnectionDelay = 1000;
  5. options.timeout = 500;
  6. final Socket socket = IO.socket(socketServerURL, options);
  7. socket.on(Socket.EVENT_CONNECT, args1 -> socket.send("hello..."));
  8. socket.on("connected", objects -> System.out.println("Server connected: " + objects[0].toString()));
  9. socket.on("push_data_event", objects -> System.out.println("Server:" + objects[0].toString()));
  10. socket.on("myBroadcast", objects -> System.out.println("Server:" + objects[0].toString()));
  11. socket.connect();
  12. socket.emit("chanel_name", message);

有什么问题?版本如下:socket服务器:2.3.0 socket js客户端:2.3.0 socket io客户端:1.0.0

9fkzdhlc

9fkzdhlc1#

通过添加一个静态类并将套接字的选项传递给此函数,可以解决此问题。它为选项添加了一些参数并解决了问题。

  1. import java.security.KeyManagementException;
  2. import java.security.NoSuchAlgorithmException;
  3. import java.security.cert.CertificateException;
  4. import java.security.cert.X509Certificate;
  5. import javax.net.ssl.HostnameVerifier;
  6. import javax.net.ssl.SSLContext;
  7. import javax.net.ssl.SSLSession;
  8. import javax.net.ssl.TrustManager;
  9. import javax.net.ssl.X509TrustManager;
  10. import io.socket.client.IO;
  11. import okhttp3.OkHttpClient;
  12. public class SocketSSL {
  13. public static OkHttpClient getOkHttpClient() {
  14. try {
  15. SSLContext sc = SSLContext.getInstance("SSL");
  16. sc.init(null, new TrustManager[]{new X509TrustManager() {
  17. @Override
  18. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  19. }
  20. @Override
  21. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  22. }
  23. @Override
  24. public X509Certificate[] getAcceptedIssuers() {
  25. return new X509Certificate[0];
  26. }
  27. }}, new java.security.SecureRandom());
  28. OkHttpClient.Builder builder = new OkHttpClient.Builder();
  29. builder.hostnameVerifier(new HostnameVerifier() {
  30. @Override
  31. public boolean verify(String hostname, SSLSession session) {
  32. return true;
  33. }
  34. });
  35. builder.sslSocketFactory(sc.getSocketFactory(), new X509TrustManager() {
  36. @Override
  37. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  38. }
  39. @Override
  40. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  41. }
  42. @Override
  43. public X509Certificate[] getAcceptedIssuers() {
  44. return new X509Certificate[0];
  45. }
  46. });
  47. return builder.build();
  48. } catch (NoSuchAlgorithmException | KeyManagementException ex) {
  49. ex.printStackTrace();
  50. }
  51. return null;
  52. }
  53. public static void set(IO.Options options) {
  54. OkHttpClient okHttpClient = getOkHttpClient();
  55. IO.setDefaultOkHttpWebSocketFactory(okHttpClient);
  56. IO.setDefaultOkHttpCallFactory(okHttpClient);
  57. options.callFactory = okHttpClient;
  58. options.webSocketFactory = okHttpClient;
  59. }
  60. }

源代码更改为以下内容:

  1. IO.Options options = new IO.Options();
  2. options.transports = new String[]{"websocket"};
  3. options.reconnectionAttempts = 2;
  4. options.reconnectionDelay = 1000;
  5. options.timeout = 500;
  6. options.rememberUpgrade = true;
  7. options.secure = true;
  8. //usage of the class
  9. SocketSSL.set(options);
  10. final Socket socket = IO.socket(socketServerURL, options);
  11. socket.on(Socket.EVENT_CONNECT, args1 -> socket.send("hello..."));
  12. socket.on("connected", objects -> System.out.println("Server connected: " + objects[0].toString()));
  13. socket.on("push_data_event", objects -> System.out.println("Server:" + objects[0].toString()));
  14. socket.on("myBroadcast", objects -> System.out.println("Server:" + objects[0].toString()));
  15. socket.connect();
  16. socket.emit("chanel_name", message);
展开查看全部

相关问题