我正在使用gottox socket.io java client作为Android聊天应用程序。
我可以在HTTP模式下同时连接到web-socket和Xhr传输。但是当我切换到HTTPS时,只有Xhr模式可以工作。我使用了默认的SSL上下文,如下所示
SocketIO.setDefaultSSLSocketFactory(SSLContext.getInstance("Default"));这在Xhr模式下工作得很好。但在websocket传输中,没有响应或错误。
发布于 2014-01-15 16:51:37
Websocket与安全套接字在AndroidAsync中工作。现在就用它吧。
发布于 2016-05-19 07:24:36
更新
这可能是因为在新版本中,IO.setDefaultSSLContext和IO. setDefaultHostnameVerifier方法不可用。取而代之的是,我们现在可以创建我们自己的OkHttpClient,并在上面设置主机名验证器和socket工厂等,就像socket.io-client-java usage上提到的那样。下面是其中的截图:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.hostnameVerifier(myHostnameVerifier)
.sslSocketFactory(mySSLContext.getSocketFactory(), myX509TrustManager)
.build(); // default settings for all sockets
IO.setDefaultOkHttpWebSocketFactory(okHttpClient);
IO.setDefaultOkHttpCallFactory(okHttpClient);初始答案:
我在Android上用io.socket:socket.io-client:0.7.0版本的socket.io库很长一段时间也遇到了同样的问题。它过去对于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);希望这能有所帮助。
发布于 2014-05-06 21:42:24
它可以工作,但你必须对io.socket库做一些修改。不使用socketio.jar,而是将io.socket库导入src文件夹(在socket.io-java-client包中可以找到)。在那里,您必须编辑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/");希望它能帮助某些人;)
https://stackoverflow.com/questions/16183753
复制相似问题