首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓Socket.io Websocket传输在SSL中不起作用

安卓Socket.io Websocket传输在SSL中不起作用
EN

Stack Overflow用户
提问于 2013-04-24 13:05:12
回答 3查看 6K关注 0票数 4

我正在使用gottox socket.io java client作为Android聊天应用程序。

我可以在HTTP模式下同时连接到web-socket和Xhr传输。但是当我切换到HTTPS时,只有Xhr模式可以工作。我使用了默认的SSL上下文,如下所示

代码语言:javascript
复制
SocketIO.setDefaultSSLSocketFactory(SSLContext.getInstance("Default"));

这在Xhr模式下工作得很好。但在websocket传输中,没有响应或错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-15 16:51:37

Websocket与安全套接字在AndroidAsync中工作。现在就用它吧。

票数 0
EN

Stack Overflow用户

发布于 2016-05-19 07:24:36

更新

这可能是因为在新版本中,IO.setDefaultSSLContextIO. setDefaultHostnameVerifier方法不可用。取而代之的是,我们现在可以创建我们自己的OkHttpClient,并在上面设置主机名验证器和socket工厂等,就像socket.io-client-java usage上提到的那样。下面是其中的截图:

代码语言:javascript
复制
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建立连接时遇到了困难。

下面的解决方案可以在不修改库本身的情况下为我工作:

代码语言:javascript
复制
// 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);

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 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

代码语言:javascript
复制
 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:

代码语言:javascript
复制
socket = new SocketIO();
socket.setDefaultSSLSocketFactory(SSLContext.getDefault());
socket.connect("https://www.myHttpsServer.com:443/");

希望它能帮助某些人;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16183753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档