【问题标题】:Spring Boot socket-io-client v1 does not emit to the socket.io server with sslSpring Boot socket-io-client v1 不会使用 ssl 发送到 socket.io 服务器
【发布时间】:2021-07-04 07:51:43
【问题描述】:

我们使用的是不带 SSL 的 socket.io 服务器 v2.3.0。 js 前端客户端和 Spring Boot 客户端正在使用该 socket.io 服务器发送和接收消息。

现在,我们正在使用 SSL。 js 前端工作正常,但 spring boot 客户端没有向 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);

有什么问题?版本如下: 套接字服务器:2.3.0 Socket js客户端:2.3.0 Socket io-client: 1.0.0

【问题讨论】:

    标签: java spring-boot socket.io


    【解决方案1】:

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

    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);
    

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 2013-10-20
      相关资源
      最近更新 更多