无法从客户端的Android连接Socket.io
问题描述:
什么是我的目标:无法从客户端的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部分和有和没有单独的经理。代码也不会以其中一种捕获结束。有什么可能出错?所有的帮助表示赞赏。谢谢阅读。
答
好的问题出现在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 {
}
} };