首页 文章

okhttp3 websocket动态 Headers

提问于
浏览
0

我正在尝试创建一个websocket,并在发送的每条消息中动态重新计算其标头 . 可能吗?

我试图使用拦截器但只调用一次 .

public void run() {

    // only open a websocket if there aren't websockets already open
    if (this.webSocket == null || !this.openingWS) {

        this.openingWS = true;

        wsBuilder = new OkHttpClient.Builder();
        OkHttpClient client = wsBuilder.addInterceptor(this)
                .readTimeout(0, TimeUnit.MILLISECONDS)
                .build();

        Request request = new Request.Builder()
                    .url("wss://...")
                    .build();


        client.newWebSocket(request, this);

        // Trigger shutdown of the dispatcher's executor so this process can exit cleanly.
        client.dispatcher().executorService().shutdown();
    }
}

@Override public void onOpen(WebSocket webSocket, Response response) {
    this.openingWS = false;     // already open
    this.webSocket = webSocket; // storing websocket for future usages
    if (listener != null) listener.onWSOpen();
}

public void sendCommand(String cmd) {
    System.out.println("SEND " + cmd);
    if (webSocket != null) webSocket.send(cmd);
}

同一个类正在实现拦截器

public Response intercept(Chain chain) throws IOException {
    Request originalRequest = chain.request();

    if (!isSpecial()) return chain.proceed(originalRequest);

    okhttp3.Request.Builder builder = originalRequest.newBuilder()
            .addHeader("text", "...")
            .addHeader("dfds", "...");


    Request compressedRequest = builder.build();

    return chain.proceed(compressedRequest);

}

标头中发送的身份验证代码将每X秒/分钟更改一次 . 如果无法动态更改标头,那么接近这种连接的最佳方法是什么?

谢谢您的帮助 .

1 回答

  • 0

    我认为标头只是在您请求连接时才第一次发送,后来取决于客户端和服务器之间的帧 .

    因此,如果您想通知服务器您已更改标头,请使用新标头发送消息 . 或者您可以关闭连接并使用新标头启动新连接 .

相关问题