2016-08-15 77 views
0

什麼是我的目標:無法從客戶端的Android連接Socket.io

我想連接到與socket.io配置上與Android的一個連接參數命名空間的插座。例如,我想通過參數「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 

這種連接succesfull,我一直在試圖用這種方法來實現的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部分和有和沒有單獨的經理。代碼也不會以其中一種捕獲結束。有什麼可能出錯?所有的幫助表示讚賞。謝謝閱讀。

回答

0

好的問題出現在hostname/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 { 
    } 
} }; 
相關問題