java - 在 OKHTTP 中实现双向间歇性数据通信
问题描述
我想知道是否有一种方法可以在 OKHTTP3 中创建双向流(或允许通过单个长轮询连接发送多个 HTTP 主体),它不需要数据在客户端和服务器之间不断流动。
对于上下文,我正在尝试实现一个系统,其中可以通过持久连接从客户端或服务器进行间歇性数据推送。该应用程序对数据使用敏感,因此我不希望客户端向服务器发送请求以查看是否有数据准备好,我只想让服务器推送它。
解决方案
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 的更多信息。
推荐阅读
- javascript - 在 json 中查找密钥
- azure-functions - 如何在 Azure 函数中使用带有 blob 绑定的动态连接字符串
- python - 如何产生一个列表以将值流式传输到烧瓶?
- android - Firebase 存储 OnSuccessListener 不起作用
- android - 为什么 customView 可以扩展 constraintLayout 但会膨胀线性布局
- ruby-on-rails - AASM 不会触发 ActiveRecord::Rollback
- c# - Castle Windsor 使用 RestSharp.RestClient 构造函数注册错误
- python - 将 numpy 数组作为灰度图像上传到 S3 存储桶
- python - Pandas Dataframes.to_csv 截断长值
- mysql - MySQL 5.5 上的递归数据