4

Android チャット アプリケーションにgottox socket.io Java クライアントを使用しています。
HTTP モードで web-socket と Xhr トランスポートの両方に接続できました。しかし、HTTPS に切り替えると、Xhr モードのみが機能します。以下のようにデフォルトのSSLコンテキストを使用しました

SocketIO.setDefaultSSLSocketFactory(SSLContext.getInstance("Default"));

これは Xhr モードで正常に動作します。しかし、websocket トランスポートでは、応答もエラーもありません。

4

3 に答える 3

2

アップデート

新しいバージョンIO.setDefaultSSLContextIO. setDefaultHostnameVerifierメソッドが利用できない可能性があります。代わりに、 socket.io-client-java の使用法OkHttpClientで説明されているように、独自のものを作成し、ホスト名ベリファイアと ssl ソケット ファクトリなどを設定できます。そこからのスニペットは次のとおりです。

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                      .hostnameVerifier(myHostnameVerifier)
                      .sslSocketFactory(mySSLContext.getSocketFactory(), myX509TrustManager)
                      .build(); // default settings for all sockets 

IO.setDefaultOkHttpWebSocketFactory(okHttpClient); 
IO.setDefaultOkHttpCallFactory(okHttpClient);

最初の答え:

Androidのsocket.ioライブラリio.socket:socket.io-client:0.7.0のバージョンで長い間同じ問題がありました。以前はプロトコルでは問題なく動作していましたが、プロトコルでは接続の確立に問題がありました。httphttpsxhr 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);

お役に立てれば。

于 2016-05-18T23:24:36.187 に答える
1

動作しますが、io.socket ライブラリにいくつかの変更を加える必要があります。socketio.jar を使用する代わりに、src フォルダーに io.socket ライブラリをインポートします (socket.io-java-client パッケージ内にあります)。そこで、WebsocketTransport クラスを編集する必要があります。

ここに解決策があります

https://github.com/Gotox/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/");

それが誰かを助けることを願っています;)

于 2014-05-06T13:42:23.763 に答える
0

AndroidAsyncで動作する SSL を使用した Websocket 。今のところそれを使用しています。

于 2014-01-15T08:51:36.533 に答える