簡體   English   中英

在 OkHttp 中使用安全的 websockets (wss)

[英]Using secure websockets (wss) with OkHttp

我嘗試使用OkHttp3連接到安全的 websocket 服務器。 使用 wss://echo.websocket.org 時它工作正常,沒問題,但是當連接到正在進行的項目的生產服務器時,我沒有正確連接到它。 30-40 秒后,在WebSocketListener調用onClosing

我懷疑這與wss SSL/TLS 加密有關。 有沒有辦法讓 OkHttpClient 接受新證書?

這是我現在用來與 OkHttp3 建立 websocket 連接的代碼。

WebSocket webSocket;
OkHttpClient client;

OkHttpClient.Builder builder = new OkHttpClient.Builder();
client = builder.build();
Request request = new Request.Builder()
        .url(MainActivity.WS_URL)
        .header("Auth-Token","secret-api-token-here")
        .build();
Log.i("WebSockets", "Headers: " + request.headers().toString());
webSocket = client.newWebSocket(request, new WebSocketListener() {

    private static final int NORMAL_CLOSURE_STATUS = 1000;
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
        webSocket.send("{Auth-Token:secret-api-token-here}");
        Log.i("WebSockets", "Connection accepted!");
        //webSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye !");
    }
    @Override
    public void onMessage(WebSocket webSocket, String text) {
        Log.i("WebSockets", "Receiving : " + text);
    }
    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
        Log.i("WebSockets", "Receiving bytes : " + bytes.hex());
    }
    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
        webSocket.close(NORMAL_CLOSURE_STATUS, null);
        Log.i("WebSockets", "Closing : " + code + " / " + reason);
    }
    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
        Log.i("WebSockets", "Error : " + t.getMessage());
    }});
}

我使用OkHttp3 websocket 通過加密連接wss與服務器連接,我面臨同樣的問題。 后來發現服務器在一段時間后關閉了連接。

我遇到了同樣的問題,我將服務器端編寫如下:

<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

require dirname(__DIR__) . '/vendor/autoload.php';
$wsServer = new WsServer(new Chat());

$server = IoServer::factory(
    new HttpServer(
        $wsServer
    ),
    8080
);

$wsServer->enableKeepAlive($server->loop, 30);

$server->run();

使用 30 秒 ping/pong 機制使連接保持活動狀態 (enableKeepAlive)。

我嘗試使用OkHttp3連接到安全的 websocket 服務器。 使用 wss://echo.websocket.org 時它工作正常,沒問題,但是當連接到正在進行的項目的生產服務器時,我無法正確連接到它。 30-40 秒后,在WebSocketListener調用onClosing

我懷疑這與wss SSL/TLS 加密有關。 有沒有辦法讓 OkHttpClient 接受新證書?

這是我現在用來與 OkHttp3 建立 websocket 連接的代碼。

WebSocket webSocket;
OkHttpClient client;

OkHttpClient.Builder builder = new OkHttpClient.Builder();
client = builder.build();
Request request = new Request.Builder()
        .url(MainActivity.WS_URL)
        .header("Auth-Token","secret-api-token-here")
        .build();
Log.i("WebSockets", "Headers: " + request.headers().toString());
webSocket = client.newWebSocket(request, new WebSocketListener() {

    private static final int NORMAL_CLOSURE_STATUS = 1000;
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
        webSocket.send("{Auth-Token:secret-api-token-here}");
        Log.i("WebSockets", "Connection accepted!");
        //webSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye !");
    }
    @Override
    public void onMessage(WebSocket webSocket, String text) {
        Log.i("WebSockets", "Receiving : " + text);
    }
    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
        Log.i("WebSockets", "Receiving bytes : " + bytes.hex());
    }
    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
        webSocket.close(NORMAL_CLOSURE_STATUS, null);
        Log.i("WebSockets", "Closing : " + code + " / " + reason);
    }
    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
        Log.i("WebSockets", "Error : " + t.getMessage());
    }});
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM