2017-02-28 43 views
0

我试图创建一个websocket并动态地重新计算每个发送的消息中的标题。可能吗?okhttp3 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秒/分钟的认证码。 如果无法动态更改标题,处理这种连接的最佳方法是什么?

谢谢你的帮助。

回答

0

我认为头只在您请求连接时才发送,稍后取决于客户端和服务器之间的帧。

所以,如果你想通知服务器,你已经改变了头,然后发送消息与你的新头。或者您可以关闭连接并使用新标题开始一个新连接。

+0

这不提供问题的答案。一旦你有足够的[声誉](https://stackoverflow.com/help/whats-reputation),你将可以[对任何帖子发表评论](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提问者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [来自评论](/ review/low-quality-posts/17561469) –