【问题标题】:Can not connect Socket.io from client Android无法从客户端 Android 连接 Socket.io
【发布时间】:2016-08-15 12:08:39
【问题描述】:

我的目标是什么:

我想使用来自 Android 的一个连接参数连接到命名空间上使用 socket.io 配置的套接字。例如,我想使用参数“token”和值“1234567890abc”连接到https://www.socket.com/messages/

到目前为止我所知道的:

套接字完全可以在 Web 客户端和 IOS 客户端上运行。 IOS客户端使用如下代码:

self.socketClient = SocketIOClient(socketURL: NSURL(string: APIManager.sharedManager.baseURL)!, options: [.Log(true), .Path(chat), .ConnectParams(["token":token])])
self.turnOnAllInitialListeners()
self.socket.connect()

如您所见,没有什么花哨的。这是价值观:

[0] : log
    - Log : false
▿ [1] : path
     - Path : "/server-x/"
▿ [2] : secure
     - Secure : true
▿ [3] : connectParams
     ▿ ConnectParams : 1 elements
          ▿ [0] : 2 elements
                - .0 : "token"
                - .1 : bXByAFX7vYMERLyOBIgbP50ufPMOPKv

这个连接是成功的,我一直在尝试用这种方法在 Android 中实现同样的效果:

    String url = "https://demo.test.test.nl";
    IO.Options opts = new IO.Options();
    opts.query = "token=bXByAFX7vYMERLyOBIgbP50ufPMOPKv";
// Tried on and off
//        opts.path = "/server-x";
    try {
        opts.sslContext = SSLContext.getDefault();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
        Manager manager = new Manager(new URI(url), opts);
        // Tried on and off
        mSocket = manager.socket("/server-x");
    } catch (URISyntaxException e) {
        Log.e(TAG, "Could not connect to socket server");
    }
    setConnectionListeners();
    setChatListeners();
    // Connected always returns into false.
    mSocket.connect();

命名空间、路径或令牌没有任何问题。还尝试了不使用 SSL 部分以及使用和不使用单独的管理器。此外,代码不会出现在其中一个问题中。会出什么问题?感谢所有帮助。感谢阅读。

【问题讨论】:

    标签: android sockets socket.io connection parameter-passing


    【解决方案1】:

    好的,问题出在主机名/ssl 证书中。打开日志记录后,我发现问题是传输错误。我找到了最讨厌的修复,现在修复它并且不会让我怀疑我的套接字代码。

        private SSLContext temporarySslSolution() {
        SSLContext sc = null;
        try {
            sc = SSLContext.getInstance("TLS");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        try {
            sc.init(null, trustAllCerts, new SecureRandom());
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
    
        HttpsURLConnection.setDefaultHostnameVerifier(new RelaxedHostNameVerifier());
        return sc;
    
    }
    
    public static class RelaxedHostNameVerifier implements HostnameVerifier {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
    
    public TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[] {};
        }
        public void checkClientTrusted(X509Certificate[] chain,
                                       String authType) throws CertificateException {
        }
    
        public void checkServerTrusted(X509Certificate[] chain,
                                       String authType) throws CertificateException {
        }
    } };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-02
      • 2013-09-26
      • 2018-11-23
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多