首页 > 解决方案 > 在 OKHTTP 中实现双向间歇性数据通信

问题描述

我想知道是否有一种方法可以在 OKHTTP3 中创建双向流(或允许通过单个长轮询连接发送多个 HTTP 主体),它不需要数据在客户端和服务器之间不断流动。

对于上下文,我正在尝试实现一个系统,其中可以通过持久连接从客户端或服务器进行间歇性数据推送。该应用程序对数据使用敏感,因此我不希望客户端向服务器发送请求以查看是否有数据准备好,我只想让服务器推送它。

标签: javaokhttpokhttp3

解决方案


Websocket连接是您问题的理想解决方案。这在客户端服务器之间创建了一个持久连接,并且双方可以随时开始发送数据。

OKHTTP中,您可以通过

将库添加到您的构建 gradle 文件compile 'com.squareup.okhttp3:okhttp:3.6.0'

创建一个实现okhttp WebsocketListener接口的

private final class MyWebSocketListener extends WebSocketListener {

  private static final int CLOSE_STATUS = 1000;
  @Override
  public void onOpen(WebSocket webSocket, Response response) {
    webSocket.send("Hello");
    webSocket.close(CLOSE_STATUS, "Goodbye");
  }
  @Override
  public void onMessage(WebSocket webSocket, String text) {
    log(text);
  }
  @Override
  public void onMessage(WebSocket webSocket, ByteString bytes) {
    log(bytes.hex());
  }
  @Override
  public void onClosing(WebSocket webSocket, int code, String reason) {
    webSocket.close(CLOSE_STATUS, null);
    log("Closing");
  }
  @Override
  public void onFailure(WebSocket webSocket, Throwable t, Response response) {
    log(t.getMessage());
  }
}

创建一个方法来启动连接

  private void connect() {
    Request request = new Request.Builder().url("ws://my.websocket.url").build();
    MyWebSocketListener listener = new MyWebSocketListener();
    WebSocket ws = client.newWebSocket(request, listener);
    \\ to shutdown the connection client.dispatcher().executorService().shutdown();
  }

这应该与服务器建立连接,并且只要应用程序处于活动状态就应该持续存在。如果您是负责后端的同一个人,我建议您阅读有关 websockets 的更多信息。


推荐阅读