我正在尝试创建一个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 回答
我认为标头只是在您请求连接时才第一次发送,后来取决于客户端和服务器之间的帧 .
因此,如果您想通知服务器您已更改标头,请使用新标头发送消息 . 或者您可以关闭连接并使用新标头启动新连接 .