From daea29154d6f7f97ec7e9068c2ad1db2f2ef9415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD?= Date: Mon, 29 Jun 2020 12:30:53 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- okhttps/src/main/java/com/ejlchina/okhttps/WebSocket.java | 6 ++++-- .../java/com/ejlchina/okhttps/internal/AsyncHttpTask.java | 6 ++++++ .../java/com/ejlchina/okhttps/internal/WebSocketTask.java | 3 +-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/okhttps/src/main/java/com/ejlchina/okhttps/WebSocket.java b/okhttps/src/main/java/com/ejlchina/okhttps/WebSocket.java index bb4b9d7..aecc48e 100644 --- a/okhttps/src/main/java/com/ejlchina/okhttps/WebSocket.java +++ b/okhttps/src/main/java/com/ejlchina/okhttps/WebSocket.java @@ -87,7 +87,7 @@ public interface WebSocket extends Cancelable { } /** - * 若连接已打开,则: + * @return 若连接已打开,则: * 同 {@link okhttp3.WebSocket#queueSize()},返回排序消息的字节数 * 否则: * 返回排队消息的数量 @@ -102,8 +102,10 @@ public interface WebSocket extends Cancelable { /** * 同 {@link okhttp3.WebSocket#close(int, String)} + * @param code Status code as defined by Section 7.4 of RFC 6455 + * @param reason Reason for shutting down or {@code null}. */ - boolean close(int code, String reason); + void close(int code, String reason); /** * 设置消息类型 diff --git a/okhttps/src/main/java/com/ejlchina/okhttps/internal/AsyncHttpTask.java b/okhttps/src/main/java/com/ejlchina/okhttps/internal/AsyncHttpTask.java index 81e4d32..d357c7e 100644 --- a/okhttps/src/main/java/com/ejlchina/okhttps/internal/AsyncHttpTask.java +++ b/okhttps/src/main/java/com/ejlchina/okhttps/internal/AsyncHttpTask.java @@ -109,6 +109,8 @@ public class AsyncHttpTask extends HttpTask { /** * 设置请求得到响应后的回调函数 + * @param 泛型 + * @param type 期望的转换类型 * @param onResBean 响应 Bean 回调 * @return HttpTask 实例 */ @@ -122,6 +124,8 @@ public class AsyncHttpTask extends HttpTask { /** * 设置请求得到响应后的回调函数 + * @param 泛型 + * @param type 期望的转换类型 * @param onResBean 响应 Bean 回调 * @return HttpTask 实例 */ @@ -135,6 +139,8 @@ public class AsyncHttpTask extends HttpTask { /** * 设置请求得到响应后的回调函数 + * @param 泛型 + * @param type 期望的转换类型 * @param onResList 请求响应回调 * @return HttpTask 实例 */ diff --git a/okhttps/src/main/java/com/ejlchina/okhttps/internal/WebSocketTask.java b/okhttps/src/main/java/com/ejlchina/okhttps/internal/WebSocketTask.java index dd32f50..ea77c51 100644 --- a/okhttps/src/main/java/com/ejlchina/okhttps/internal/WebSocketTask.java +++ b/okhttps/src/main/java/com/ejlchina/okhttps/internal/WebSocketTask.java @@ -310,12 +310,11 @@ public class WebSocketTask extends HttpTask { } @Override - public synchronized boolean close(int code, String reason) { + public synchronized void close(int code, String reason) { if (webSocket != null) { webSocket.close(code, reason); } cancelOrClosed = true; - return true; } @Override -- Gitee From 557cc3bb87c5e2a2ca46c075421e09a7d82a786a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD?= <15735559897@qq.com> Date: Tue, 21 Jul 2020 14:51:54 +0800 Subject: [PATCH 02/10] doc --- okhttps-doc/docs/.vuepress/config.js | 1 + okhttps-doc/docs/v2/README.md | 9 +++++++++ okhttps-doc/docs/v2/foundation.md | 2 +- okhttps-doc/docs/v2/getstart.md | 16 ++++++++-------- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/okhttps-doc/docs/.vuepress/config.js b/okhttps-doc/docs/.vuepress/config.js index 6c60b7b..881aa5a 100644 --- a/okhttps-doc/docs/.vuepress/config.js +++ b/okhttps-doc/docs/.vuepress/config.js @@ -45,6 +45,7 @@ module.exports = { 'foundation', 'configuration', 'updownload', + 'websocket', 'android' ] }, diff --git a/okhttps-doc/docs/v2/README.md b/okhttps-doc/docs/v2/README.md index 6e35dfd..ddbc1d7 100644 --- a/okhttps-doc/docs/v2/README.md +++ b/okhttps-doc/docs/v2/README.md @@ -33,6 +33,15 @@ okhttps | 2.3.0 | OkHttps 核心模块 [okhttps-stomp](https://gitee.com/ejlchina-zhxu/okhttps-stomp) | 1.0.1 | 超级轻量的 Stomp 客户端 +## v2.3 的新特性 + +重新实现 WebSocket 心跳机制 +使用者可以选择使用 OkHttp 自带的新桃模式,也可以选择使用 OkHttps 提供的增强型新增机制,它具有如下特性 + +1. 客户端发送的任何消息都具有一次客户端心跳作用 +2. 服务器发送的任何消息都具有一次服务器心跳作用 +3. 若服务器超过 3 * pongSeconds 秒没有回复心跳,才判断心跳超时 + ## v2.2 的新特性 1. 增强泛型反序列化,支持复合泛型 diff --git a/okhttps-doc/docs/v2/foundation.md b/okhttps-doc/docs/v2/foundation.md index 0f0b58d..f93e903 100644 --- a/okhttps-doc/docs/v2/foundation.md +++ b/okhttps-doc/docs/v2/foundation.md @@ -6,7 +6,7 @@ description: OkHttps 请求方法 回调函数 HttpResult cache 多次 消费报 ## 请求方法 -OkHttps 使用`sync()`和`async()`方式发起的请求,支持的 HTTP 方法有: +OkHttps 使用`sync()`和`async()`方式发起 同步和异步的 HTTP 请求,它们支持的方法有: HTTP 请求方法 | 实现方法 | Restful 释义 | 起始版本 -|-|-|- diff --git a/okhttps-doc/docs/v2/getstart.md b/okhttps-doc/docs/v2/getstart.md index 6c70e04..ba07e46 100644 --- a/okhttps-doc/docs/v2/getstart.md +++ b/okhttps-doc/docs/v2/getstart.md @@ -14,7 +14,7 @@ description: OkHttps 安装 构建实例 HTTP build 同步请求 异步请求 sy com.ejlchina okhttps - 2.2.0 + 2.3.0 ``` @@ -26,7 +26,7 @@ description: OkHttps 安装 构建实例 HTTP build 同步请求 异步请求 sy com.ejlchina okhttps-fastjson - 2.2.0 + 2.3.0 ``` @@ -36,7 +36,7 @@ description: OkHttps 安装 构建实例 HTTP build 同步请求 异步请求 sy com.ejlchina okhttps-gson - 2.2.0 + 2.3.0 ``` @@ -46,7 +46,7 @@ description: OkHttps 安装 构建实例 HTTP build 同步请求 异步请求 sy com.ejlchina okhttps-jackson - 2.2.0 + 2.3.0 ``` @@ -59,7 +59,7 @@ description: OkHttps 安装 构建实例 HTTP build 同步请求 异步请求 sy #### 单独使用 OkHttps ```groovy -implementation 'com.ejlchina:okhttps:2.2.0' +implementation 'com.ejlchina:okhttps:2.3.0' ``` 单独使用 OkHttps 需要自定义[`MsgConvertor`](https://gitee.com/ejlchina-zhxu/okhttps/blob/master/okhttps/src/main/java/com/ejlchina/okhttps/MsgConvertor.java),否则无法使用 **自动正反序列化** 相关功能,后文会详细讲解哪些功能会受到此影响。 @@ -67,19 +67,19 @@ implementation 'com.ejlchina:okhttps:2.2.0' #### 与 fastjson 一起使用 ```groovy -implementation 'com.ejlchina:okhttps-fastjson:2.2.0' +implementation 'com.ejlchina:okhttps-fastjson:2.3.0' ``` #### 与 gson 一起使用 ```groovy -implementation 'com.ejlchina:okhttps-gson:2.2.0' +implementation 'com.ejlchina:okhttps-gson:2.3.0' ``` #### 与 jackson 一起使用 ```groovy -implementation 'com.ejlchina:okhttps-jackson:2.2.0' +implementation 'com.ejlchina:okhttps-jackson:2.3.0' ``` ::: tip -- Gitee From 7eac9128d076f586a1cfbe811b713b72fb618b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD?= <15735559897@qq.com> Date: Tue, 21 Jul 2020 15:03:23 +0800 Subject: [PATCH 03/10] doc --- okhttps-doc/docs/v2/getstart.md | 15 +++++++ okhttps-doc/docs/v2/websocket.md | 67 ++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 okhttps-doc/docs/v2/websocket.md diff --git a/okhttps-doc/docs/v2/getstart.md b/okhttps-doc/docs/v2/getstart.md index ba07e46..25308b3 100644 --- a/okhttps-doc/docs/v2/getstart.md +++ b/okhttps-doc/docs/v2/getstart.md @@ -54,6 +54,16 @@ description: OkHttps 安装 构建实例 HTTP build 同步请求 异步请求 sy 以上依赖四选一即可 ::: +如需使用 Stomp 客户端能力,则可以添加: + +```xml + + com.ejlchina + okhttps-stomp + 1.0.1 + +``` + ### Gradle #### 单独使用 OkHttps @@ -86,6 +96,11 @@ implementation 'com.ejlchina:okhttps-jackson:2.3.0' 以上依赖四选一即可 ::: +如需使用 Stomp 客户端能力,则可以添加: + +```groovy +implementation 'com.ejlchina:okhttps-stomp:1.0.1' +``` #### JDK 版本 diff --git a/okhttps-doc/docs/v2/websocket.md b/okhttps-doc/docs/v2/websocket.md new file mode 100644 index 0000000..92f8eab --- /dev/null +++ b/okhttps-doc/docs/v2/websocket.md @@ -0,0 +1,67 @@ +--- +description: OkHttps 配置 BaseUrl 回调执行器 主线程 UI线程 OkHttpClient 预处理器 TOKEN问题最佳解决方案 刷新TOKEN 全局 回调监听 下载监听 回调阻断 拦截器 CookieJar、SSL、缓存、代理、事件监听 +--- + +# WebSocket + +OkHttps 使用`webSocket()`方式发起 WebSocket 连接,并使用`listen()`方法启动监听。 + +## WebSocket 请求 + +如果在连接时需要向服务器传递参数,处理方式和 HTTP 请求一样,例如需要用户名和密码才能连接 WebSocket 服务: + +```java +http.webSocket("/chat") + .addUrlPara("username", "Jack") + .addUrlPara("password", "xxxxxxxx") + .setOnMessage((WebSocket ws,Message msg) -> { + + }) + .listen(); // 启动监听 +``` + +### 心跳机制 + +OkHttps 自带两种心跳机制 + +#### OkHttp 的心跳机制 + +在构建`HTTP`实例时,配置一个全局心跳间隔: + +```java +HTTP http = HTTP.builder() + .config((OkHttpClient.Builder builder) -> { + + // 配置 WebSocket 心跳间隔(默认没有心跳) + builder.pingInterval(10, TimeUnit.SECONDS); + }) + .build(); +``` + +如上配置,当使用这个`HTTP`实例发起 WebSocket 连接时,客户端会每隔 10秒 向服务器发送一次 PING 消息,同时服务器必须在客户端发送心跳后的 10秒 内回复 PONG 消息,否则就会触发`SocketTimeoutException`异常 + +#### OkHttps 的心跳机制 + +OkHttps 提供了另外一种心跳机制,它在发起具体的 WebSocket 连接时通过`heatbeat(int pingSeconds, int pongSeconds)`方法指定: + +```java +http.webSocket("/chat") + .heatbeat(10, 10) + .setOnMessage((WebSocket ws,Message msg) -> { + + }) + .listen(); // 启动监听 +``` + +如上配置,客户端仍会每隔 10秒 向服务器发送一次 PING 消息,并期望服务器回复 PONG 消息的间隔也是 10 秒一次,但如果服务器或网络由于某些未知原因导致客户端未能正确收到 PONG 消息,客户端还会容忍两次失败,当第三个 10 秒后还未收到服务器的任何消息时,则会触发`SocketTimeoutException`异常 + +::: tip OkHttps 的心跳机制相对于 OkHttp 主要有以下特点 +* 客户端发送的任何消息都具有一次心跳作用 +* 服务器发送的任何消息都具有一次心跳作用 +* 若服务器超过 3 * pongSeconds 秒没有回复心跳,才触发心跳超时 +::: + + +
+ + \ No newline at end of file -- Gitee From 03135d6b3bcf1ea9b99068308a2e27eff75fc6c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD?= <15735559897@qq.com> Date: Tue, 21 Jul 2020 16:25:11 +0800 Subject: [PATCH 04/10] doc --- okhttps-doc/docs/v2/foundation.md | 2 +- okhttps-doc/docs/v2/websocket.md | 108 ++++++++++++++++++++++++++++-- 2 files changed, 104 insertions(+), 6 deletions(-) diff --git a/okhttps-doc/docs/v2/foundation.md b/okhttps-doc/docs/v2/foundation.md index f93e903..5e7ce34 100644 --- a/okhttps-doc/docs/v2/foundation.md +++ b/okhttps-doc/docs/v2/foundation.md @@ -6,7 +6,7 @@ description: OkHttps 请求方法 回调函数 HttpResult cache 多次 消费报 ## 请求方法 -OkHttps 使用`sync()`和`async()`方式发起 同步和异步的 HTTP 请求,它们支持的方法有: +OkHttps 使用`sync(String url)`和`async(String url)`方法发起 同步和异步的 HTTP 请求,它们支持的方法有: HTTP 请求方法 | 实现方法 | Restful 释义 | 起始版本 -|-|-|- diff --git a/okhttps-doc/docs/v2/websocket.md b/okhttps-doc/docs/v2/websocket.md index 92f8eab..d150962 100644 --- a/okhttps-doc/docs/v2/websocket.md +++ b/okhttps-doc/docs/v2/websocket.md @@ -4,9 +4,9 @@ description: OkHttps 配置 BaseUrl 回调执行器 主线程 UI线程 OkHttpCli # WebSocket -OkHttps 使用`webSocket()`方式发起 WebSocket 连接,并使用`listen()`方法启动监听。 +OkHttps 使用`webSocket(String url)`方法发起 WebSocket 连接,并使用`listen()`方法启动监听。 -## WebSocket 请求 +## 连接参数 如果在连接时需要向服务器传递参数,处理方式和 HTTP 请求一样,例如需要用户名和密码才能连接 WebSocket 服务: @@ -20,11 +20,15 @@ http.webSocket("/chat") .listen(); // 启动监听 ``` -### 心跳机制 +::: warning 注意 +WebSocket 连接只能添加 **请求头**、 **Url 参数**(查询参数)和 **Path 参数**, 报文体参数(Body)和 文件参数是不允许添加的。 +::: + +## 心跳机制 OkHttps 自带两种心跳机制 -#### OkHttp 的心跳机制 +### OkHttp 的心跳机制 在构建`HTTP`实例时,配置一个全局心跳间隔: @@ -40,7 +44,7 @@ HTTP http = HTTP.builder() 如上配置,当使用这个`HTTP`实例发起 WebSocket 连接时,客户端会每隔 10秒 向服务器发送一次 PING 消息,同时服务器必须在客户端发送心跳后的 10秒 内回复 PONG 消息,否则就会触发`SocketTimeoutException`异常 -#### OkHttps 的心跳机制 +### OkHttps 的心跳机制 OkHttps 提供了另外一种心跳机制,它在发起具体的 WebSocket 连接时通过`heatbeat(int pingSeconds, int pongSeconds)`方法指定: @@ -61,6 +65,100 @@ http.webSocket("/chat") * 若服务器超过 3 * pongSeconds 秒没有回复心跳,才触发心跳超时 ::: +## 消息收发 + +### 接收消息 + +发起 WebSocket 连接是,设置一个`OnMessage`回调,便可接收到服务器的消息: + +```java +http.webSocket("/chat") + .setOnMessage((WebSocket ws,Message msg) -> { + // 接收到消息 msg + }) + .listen(); // 启动监听 +``` + +在该回调内接收到一个`Message`类型的消息对象,它和`HttpReault.Body`都继承自`Toable`接口,他共有如下一些方法: + +* `isText()` 判断是文本消息还是二进制消息 +* `toByteStream()` 消息体转字节流 +* `toBytes()` 消息体转字数组 +* `toByteString()` 消息体转字数组 +* `toCharStream()` 消息体转字符流 +* `toString()` 消息体转字符串 +* `toMapper()` 消息体转 Mapper 对象(不想定义 Java Bean 时使用) +* `toArray()` 消息体转 Array 数组(不想定义 Java Bean 时使用) +* `toBean(Class type)` 报文体Json文本转JavaBean +* `toBean(Type type)` 报文体Json文本转JavaBean +* `toBean(TypeRef type)` 报文体Json文本转JavaBean +* `toList(Class type)` 报文体Json文本转JavaBean列表 + +### 发送消息 + +向服务器发送消息,首先要获得一个`WebSocket`实例,该实例可以通过`listen()`方法的返回值或回调方法的参数获取,如: + +```java +WebSocket ws = http.webSocket("/chat").listen(); // 启动监听,并返回一个 WebSocket 实例 +``` + +接口`WebSocket`继承自`Cancelable`,它共定义了如下方法: + +* `cancel()` 取消连接(连接成功前可以取消) +* `queueSize()` 排队待发送消息的数量 +* `send(Object object)` 发送消息,参数是待发送的对象,可以是 String | ByteString | byte[] | Java Bean +* `close(int code, String reason)` 关闭连接(连接成功后可以关闭) +* `msgType(String type)` 设置消息传输类型,类似于`bodyType` + +一个发送消息的例子 + +```java +WebSocket ws = http.webSocket("/chat").listen(); +ws.send("Hello World!") // 该消息会先进入排队等待状态,当连接成功时发送给服务器 +``` + +或者 + +```java +http.webSocket("/chat") + .setOnOpen((WebSocket ws, HttpResult res) -> { + // 当连接成功时发送给服务器 + ws.send("Hello World!") + }) + .listen(); +``` + +## 回调方法 + +WebSocket 连接共可设置 **5** 种回调方法: + +```java +http.webSocket("/websocket-endpoint") + .setOnOpen((WebSocket ws, HttpResult res) -> { + // WebSocket 连接成功时回调 + }) + .setOnMessage((WebSocket ws, Message msg) -> { + // 收到服务器下发的消息时回调 + }) + .setOnException((WebSocket ws, Throwable thr) -> { + // 连接发生异常时回调 + }) + .setOnClosing((WebSocket ws, WebSocket.Close close) -> { + // 连接正在关闭时回调 + }) + .setOnClosed((WebSocket ws, WebSocket.Close close) -> { + // 连接已关闭(v2.0.0 之后包含连接被取消 和 连接发生异常)时回调 + }) + .listen(); +``` + +::: tip 需要注意的是 +如果设置了 [全局回调监听](/v2/configuration.html#全局回调监听), 它们对 WebSocket 连接 同样起作用 +::: + + + +
-- Gitee From 5ed8e7ccdf68349187bce50aa502103da5d2b955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD?= <15735559897@qq.com> Date: Tue, 21 Jul 2020 16:38:15 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ejlchina/okhttps/internal/WebSocketTask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/okhttps/src/main/java/com/ejlchina/okhttps/internal/WebSocketTask.java b/okhttps/src/main/java/com/ejlchina/okhttps/internal/WebSocketTask.java index ea77c51..03b1962 100644 --- a/okhttps/src/main/java/com/ejlchina/okhttps/internal/WebSocketTask.java +++ b/okhttps/src/main/java/com/ejlchina/okhttps/internal/WebSocketTask.java @@ -65,6 +65,7 @@ public class WebSocketTask extends HttpTask { * 2、服务器发送的任何消息都具有一次心跳作用 * 3、若服务器超过 3 * pongSeconds 秒没有回复心跳,才判断心跳超时 * + * @since v2.3.0 * @param pingSeconds 客户端心跳间隔秒数(0 表示不需要心跳) * @param pongSeconds 服务器心跳间隔秒数(0 表示不需要心跳) * @return WebSocketTask -- Gitee From 1e4524dbcf24bda02120aa0140506c3b21c158e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD?= <15735559897@qq.com> Date: Tue, 21 Jul 2020 19:30:23 +0800 Subject: [PATCH 06/10] doc --- okhttps-doc/docs/.vuepress/config.js | 1 + okhttps-doc/docs/v2/getstart.md | 4 ++-- okhttps-doc/docs/v2/websocket.md | 13 +++++-------- pom.xml | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/okhttps-doc/docs/.vuepress/config.js b/okhttps-doc/docs/.vuepress/config.js index 881aa5a..16f328c 100644 --- a/okhttps-doc/docs/.vuepress/config.js +++ b/okhttps-doc/docs/.vuepress/config.js @@ -46,6 +46,7 @@ module.exports = { 'configuration', 'updownload', 'websocket', + 'stomp', 'android' ] }, diff --git a/okhttps-doc/docs/v2/getstart.md b/okhttps-doc/docs/v2/getstart.md index 25308b3..58fc6ef 100644 --- a/okhttps-doc/docs/v2/getstart.md +++ b/okhttps-doc/docs/v2/getstart.md @@ -54,7 +54,7 @@ description: OkHttps 安装 构建实例 HTTP build 同步请求 异步请求 sy 以上依赖四选一即可 ::: -如需使用 Stomp 客户端能力,则可以添加: +#### 使用 Stomp 客户端 ```xml @@ -96,7 +96,7 @@ implementation 'com.ejlchina:okhttps-jackson:2.3.0' 以上依赖四选一即可 ::: -如需使用 Stomp 客户端能力,则可以添加: +#### 使用 Stomp 客户端 ```groovy implementation 'com.ejlchina:okhttps-stomp:1.0.1' diff --git a/okhttps-doc/docs/v2/websocket.md b/okhttps-doc/docs/v2/websocket.md index d150962..a749536 100644 --- a/okhttps-doc/docs/v2/websocket.md +++ b/okhttps-doc/docs/v2/websocket.md @@ -1,5 +1,5 @@ --- -description: OkHttps 配置 BaseUrl 回调执行器 主线程 UI线程 OkHttpClient 预处理器 TOKEN问题最佳解决方案 刷新TOKEN 全局 回调监听 下载监听 回调阻断 拦截器 CookieJar、SSL、缓存、代理、事件监听 +description: OkHttps WebSocket Heatbeat 心跳 OkHttp --- # WebSocket @@ -28,9 +28,9 @@ WebSocket 连接只能添加 **请求头**、 **Url 参数**(查询参数) OkHttps 自带两种心跳机制 -### OkHttp 的心跳机制 +### 全局心跳配置 -在构建`HTTP`实例时,配置一个全局心跳间隔: +在构建`HTTP`实例时,可以配置一个全局心跳时间间隔: ```java HTTP http = HTTP.builder() @@ -44,9 +44,9 @@ HTTP http = HTTP.builder() 如上配置,当使用这个`HTTP`实例发起 WebSocket 连接时,客户端会每隔 10秒 向服务器发送一次 PING 消息,同时服务器必须在客户端发送心跳后的 10秒 内回复 PONG 消息,否则就会触发`SocketTimeoutException`异常 -### OkHttps 的心跳机制 +### 单次心跳配置(since V2.3.0) -OkHttps 提供了另外一种心跳机制,它在发起具体的 WebSocket 连接时通过`heatbeat(int pingSeconds, int pongSeconds)`方法指定: +自 V2.3.0 起 OkHttps 提供了另外一种心跳机制,它在发起具体的 WebSocket 连接时通过方法`heatbeat(int pingSeconds, int pongSeconds)`分别指定客户端与服务器的心跳时间间隔: ```java http.webSocket("/chat") @@ -157,9 +157,6 @@ http.webSocket("/websocket-endpoint") ::: - - -
\ No newline at end of file diff --git a/pom.xml b/pom.xml index 66a94cd..ac42a33 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ 2.3.0 1.8 - 3.14.9 + 4.8.0 2.8.6 1.2.67 2.11.0 -- Gitee From 7459812a600529a1fb8fa4c2c31f3c20676652d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD?= <15735559897@qq.com> Date: Tue, 21 Jul 2020 19:31:44 +0800 Subject: [PATCH 07/10] doc --- okhttps-doc/docs/v2/stomp.md | 64 ++++++++++++++++++++++++++++++++++++ pom.xml | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 okhttps-doc/docs/v2/stomp.md diff --git a/okhttps-doc/docs/v2/stomp.md b/okhttps-doc/docs/v2/stomp.md new file mode 100644 index 0000000..b4e1311 --- /dev/null +++ b/okhttps-doc/docs/v2/stomp.md @@ -0,0 +1,64 @@ +--- +description: OkHttps WebSocket Heatbeat 心跳 OkHttp +--- + +# Stomp + +项目 [OkHttps Stomp](https://gitee.com/ejlchina-zhxu/okhttps-stomp) 基于 OkHttps 的 [WebSocket](/v2/websocket.html) 功能实现了一个非常轻量的 Stomp 客户端协议,它可以让你轻松实现 **广播发布与订阅** 和 **队列发布与订阅** 的客户端功能。 + +## 构建 Stomp 实例 + +类`Stomp`提供静态方法`over`来构建`Stomp`实例: + +* `over(WebSocketTask task)` 基于 OkHttps 的 WebSocket 构建一个 Stomp 实例,并自动确认消息 +* `over(WebSocketTask task, boolean autoAck)` 构建一个 Stomp 实例,并可指定是否自动确认消息 + +例如: + +```java +// 使用一个 Websocket 连接构建一个 Stomp 实例,同时设置心跳间隔为 20 秒 +Stomp stomp = Stomp.over(OkHttps.webSocket(UrlConsts.WEB_SOCKET).heatbeat(20, 20)); +``` + +以上代码构建了一个简单的 Stomp 客户端,并默认在收到消息时会**自动确认**,如果需要收到确认,可以使用下面的方式: + +```java +Stomp stomp = Stomp.over( + OkHttps.webSocket(UrlConsts.WEB_SOCKET).heatbeat(20, 20), + false // 参数设置 autoAck 为 false,将不自动确认消息 + ); +``` + +## 连接 Stomp 服务 + +得到一个`Stomp`实例后,可使用以下两个方法连接 Stomp 服务器: + +* `connect()` 直接连接 Stomp 服务器 +* `connect(List
headers)` 携带一些 Stomp 头信息连接 Stomp 服务器 + +例如: + +```java +stomp.connect(); +``` + +如果服务器在连接时需要指令一些额外信息,比如连接 RabbitMQ 时需要指定`login`、`passcode` 和 `vhost`: + +```java +List
headers = new ArrayList<>(); +headers.add(new Header("login", "username")); +headers.add(new Header("passcode", "xxxxxxx")); +headers.add(new Header("host", "your_vhost")); + +stomp.connect(headers); +``` + +## 消息定阅 + + + + + +
+ + \ No newline at end of file diff --git a/pom.xml b/pom.xml index ac42a33..66a94cd 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ 2.3.0 1.8 - 4.8.0 + 3.14.9 2.8.6 1.2.67 2.11.0 -- Gitee From 8c6e5c8e6e4d59a5c6e727f09dce5fce2d6f01a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD?= <15735559897@qq.com> Date: Tue, 21 Jul 2020 21:37:01 +0800 Subject: [PATCH 08/10] doc --- okhttps-doc/docs/v2/stomp.md | 68 +++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/okhttps-doc/docs/v2/stomp.md b/okhttps-doc/docs/v2/stomp.md index b4e1311..1f0a4d6 100644 --- a/okhttps-doc/docs/v2/stomp.md +++ b/okhttps-doc/docs/v2/stomp.md @@ -17,15 +17,15 @@ description: OkHttps WebSocket Heatbeat 心跳 OkHttp ```java // 使用一个 Websocket 连接构建一个 Stomp 实例,同时设置心跳间隔为 20 秒 -Stomp stomp = Stomp.over(OkHttps.webSocket(UrlConsts.WEB_SOCKET).heatbeat(20, 20)); +Stomp stomp = Stomp.over(OkHttps.webSocket("wss://...").heatbeat(20, 20)); ``` 以上代码构建了一个简单的 Stomp 客户端,并默认在收到消息时会**自动确认**,如果需要收到确认,可以使用下面的方式: ```java Stomp stomp = Stomp.over( - OkHttps.webSocket(UrlConsts.WEB_SOCKET).heatbeat(20, 20), - false // 参数设置 autoAck 为 false,将不自动确认消息 + OkHttps.webSocket("wss://...").heatbeat(20, 20), + false // 参数设置 autoAck 为 false,将需要手动确认消息 ); ``` @@ -53,11 +53,71 @@ headers.add(new Header("host", "your_vhost")); stomp.connect(headers); ``` -## 消息定阅 +## 连接状态监听 +```java +Stomp.over(OkHttps.webSocket("wss://...").heatbeat(20, 20)) + .setOnConnected(stomp -> { + // 服务器连接成功回调 + }) + .setOnDisconnected(close -> { + // 连接已断开回调 + }) + .connect(); +``` + +## 消息订阅与退订 + +### 订阅广播 + +```java +stomp.topic("/your-topic", (Message msg) -> { + // 得到消息负载 + String payload = msg.getPayload(); + + // 如果需要手动确认消息,调用此方法确认 + stomp.ack(msg) +}); +``` + +### 退订广播 + +```java +stomp.untopic("/your-topic"); +``` + +### 订阅队列 +```java +stomp.queue("/your-queue", (Message msg) -> { + // 得到消息负载 + String payload = msg.getPayload(); + + // 如果需要手动确认消息,调用此方法确认 + stomp.ack(msg) +}); +``` + +### 退订队列 + +```java +stomp.unqueue("/your-queue"); +``` +## 发送消息 +```java +// 发送到广播 +stomp.sendTo("/topic/your-topic", "Hello World"); +// 发送到队列 +stomp.sendTo("/queue/your-queue", "Hello World"); +``` + +## 断开服务 + +```java +stomp.disconnect(); +```
-- Gitee From 02178a4c39951c0f956f4848eb4bac78fef5bd09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD?= <15735559897@qq.com> Date: Tue, 21 Jul 2020 21:37:59 +0800 Subject: [PATCH 09/10] doc --- okhttps-doc/docs/v2/stomp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/okhttps-doc/docs/v2/stomp.md b/okhttps-doc/docs/v2/stomp.md index 1f0a4d6..4a4b507 100644 --- a/okhttps-doc/docs/v2/stomp.md +++ b/okhttps-doc/docs/v2/stomp.md @@ -1,5 +1,5 @@ --- -description: OkHttps WebSocket Heatbeat 心跳 OkHttp +description: OkHttps WebSocket Stomp OkHttp --- # Stomp -- Gitee From 09ed00e917ad505c1da14f6fdd66b57d7f358e1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD?= <15735559897@qq.com> Date: Tue, 21 Jul 2020 21:56:37 +0800 Subject: [PATCH 10/10] doc --- okhttps-doc/docs/v2/stomp.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/okhttps-doc/docs/v2/stomp.md b/okhttps-doc/docs/v2/stomp.md index 4a4b507..932a7e1 100644 --- a/okhttps-doc/docs/v2/stomp.md +++ b/okhttps-doc/docs/v2/stomp.md @@ -6,6 +6,26 @@ description: OkHttps WebSocket Stomp OkHttp 项目 [OkHttps Stomp](https://gitee.com/ejlchina-zhxu/okhttps-stomp) 基于 OkHttps 的 [WebSocket](/v2/websocket.html) 功能实现了一个非常轻量的 Stomp 客户端协议,它可以让你轻松实现 **广播发布与订阅** 和 **队列发布与订阅** 的客户端功能。 +## 添加依赖 + +要开启 Stomp 功能,需要添加以下依赖: + +### Maven + +```xml + + com.ejlchina + okhttps-stomp + 1.0.1 + +``` + +### Gradle + +```groovy +implementation 'com.ejlchina:okhttps-stomp:1.0.1' +``` + ## 构建 Stomp 实例 类`Stomp`提供静态方法`over`来构建`Stomp`实例: -- Gitee