Spring Boot socket-io-client v1 不使用 ssl 发送到 socket.io 服务器

Spring Boot socket-io-client v1 does not emit to the socket.io server with ssl

我们使用的是 socket.io 服务器 v2.3.0,没有 SSL。 js 前端客户端和 spring 引导客户端正在使用该 socket.io 服务器发送和接收消息。

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

IO.Options options = new IO.Options();
options.transports = new String[]{"websocket"};
options.reconnectionAttempts = 2;
options.reconnectionDelay = 1000;
options.timeout = 500;

final Socket socket = IO.socket(socketServerURL, options);
socket.on(Socket.EVENT_CONNECT, args1 -> socket.send("hello..."));
socket.on("connected", objects -> System.out.println("Server connected: " + objects[0].toString()));
socket.on("push_data_event", objects -> System.out.println("Server:" + objects[0].toString()));
socket.on("myBroadcast", objects -> System.out.println("Server:" + objects[0].toString()));
socket.connect();
socket.emit("chanel_name", message);

问题是什么?版本如下: 套接字server:2.3.0 套接字 js 客户端:2.3.0 套接字 io 客户端:1.0.0

问题通过添加静态class并将套接字的选项传递给此函数来解决。它在选项中添加了一些参数并解决了问题。

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import io.socket.client.IO;
import okhttp3.OkHttpClient;

public class SocketSSL {

    public static OkHttpClient getOkHttpClient() {

        try {

            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, new TrustManager[]{new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            }}, new java.security.SecureRandom());

            OkHttpClient.Builder builder = new OkHttpClient.Builder();

            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

            builder.sslSocketFactory(sc.getSocketFactory(), new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            });

            return builder.build();

        } catch (NoSuchAlgorithmException | KeyManagementException ex) {
            ex.printStackTrace();
        }

        return null;
    }

    public static void set(IO.Options options) {
        OkHttpClient okHttpClient = getOkHttpClient();
        IO.setDefaultOkHttpWebSocketFactory(okHttpClient);
        IO.setDefaultOkHttpCallFactory(okHttpClient);
        options.callFactory = okHttpClient;
        options.webSocketFactory = okHttpClient;
    }
}

源代码更改为:

 IO.Options options = new IO.Options();
 options.transports = new String[]{"websocket"};
 options.reconnectionAttempts = 2;
 options.reconnectionDelay = 1000;
 options.timeout = 500;
 options.rememberUpgrade = true;
 options.secure = true;
                
 //usage of the class
 SocketSSL.set(options);
 
 final Socket socket = IO.socket(socketServerURL, options);
 socket.on(Socket.EVENT_CONNECT, args1 -> socket.send("hello..."));
 socket.on("connected", objects -> System.out.println("Server connected: " + objects[0].toString()));
 socket.on("push_data_event", objects -> System.out.println("Server:" + objects[0].toString()));
 socket.on("myBroadcast", objects -> System.out.println("Server:" + objects[0].toString()));

 socket.connect();
 socket.emit("chanel_name", message);