我使用gottox socket.io Java客户端的一个Android聊天应用。
我可以连接到这两个网络的插座和XHR运输HTTP模式。 但是,当我切换到HTTPS仅XHR模式工作。 我用默认的SSL上下文如下
SocketIO.setDefaultSSLSocketFactory(SSLContext.getInstance("Default"));
这XHR模式工作正常。 但在WebSocket的运输没有响应或错误。
我使用gottox socket.io Java客户端的一个Android聊天应用。
我可以连接到这两个网络的插座和XHR运输HTTP模式。 但是,当我切换到HTTPS仅XHR模式工作。 我用默认的SSL上下文如下
SocketIO.setDefaultSSLSocketFactory(SSLContext.getInstance("Default"));
这XHR模式工作正常。 但在WebSocket的运输没有响应或错误。
更新
这可能是与新版本IO.setDefaultSSLContext
和IO. setDefaultHostnameVerifier
IO. setDefaultHostnameVerifier
方法不可用。 相反,现在我们可以创建自己的OkHttpClient
并提到设置主机名验证和SSL套接字工厂等它socket.io客户端的Java使用 。 下面是从那里sniplet:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.hostnameVerifier(myHostnameVerifier)
.sslSocketFactory(mySSLContext.getSocketFactory(), myX509TrustManager)
.build(); // default settings for all sockets
IO.setDefaultOkHttpWebSocketFactory(okHttpClient);
IO.setDefaultOkHttpCallFactory(okHttpClient);
最初的回答:
我有同样的问题io.socket:socket.io-client:0.7.0
版本的socket.io在Android库长。 它用来为做工精细http
协议,但是,对于https
协议,它遇到了麻烦建立连接给xhr poll errors
。
下面的解决方案对我的作品,而无需修改库本身:
// Socket connection
private Socket mSocket;
// Configure options
IO.Options options = new IO.Options();
// ... add more options
// End point https
String yourEndpoint = "https://whatever.yoururl.com"
String yourHostName = "yoururl.com"
// If https, explicitly tell set the sslContext.
if (yourEndpoint.startsWith("https://")) {
try {
// Default settings for all sockets
// Set default ssl context
IO.setDefaultSSLContext(SSLContext.getDefault());
// Set default hostname
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
return hv.verify(yourHostName, session);
}
};
IO.setDefaultHostnameVerifier(hostnameVerifier);
// set as an option
options.sslContext = SSLContext.getDefault();
options.hostnameVerifier = hostnameVerifier;
options.secure = true;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
// Instantiate the socket
mSocket = IO.socket(mEndpoint, options);
希望这可以帮助。
它的工作原理,但你必须做io.socket库进行一些修改。 除了使用socketio.jar,导入到src文件夹的io.socket库(你会发现socket.io-Java的客户端程序包内)。 在那里,你必须编辑WebsocketTransport类。
在这里,你有解决方案
https://github.com/Gottox/socket.io-java-client/issues/60
public WebsocketTransport(URI uri, IOConnection connection) {
super(uri);
this.connection = connection;
SSLContext context = null;
try {
context = SSLContext.getInstance("TLS", "HarmonyJSSE");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
try {
context.init(null, null, null);
} catch (KeyManagementException e) {
e.printStackTrace();
}
if("wss".equals(uri.getScheme()) && context != null) {
this.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(context));
}
}
要记住,这样调用的setDefaultSSLSocketFactory:
socket = new SocketIO();
socket.setDefaultSSLSocketFactory(SSLContext.getDefault());
socket.connect("https://www.myHttpsServer.com:443/");
希望它可以帮助别人;)
使用的WebSocket中的SSL工作AndroidAsync 。 使用现在。