使用OkHttp实现安全的WebSockets(wss)

5

我尝试使用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());
    }});
}
2个回答

1
我使用了 OkHttp3 的websocket连接到一个加密的服务器 wss,但是遇到了同样的问题。后来发现是服务器在一定时间后关闭了连接。

0

我曾经遇到过同样的问题,我按照以下方式编写了服务器端:

<?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)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接