java socket 自动重连_RxWebSocket是一个基于okhttp和RxJava封装的自动重连WebSocket客户端...

RxWebSocket

招聘:我司正在招聘Android架构师职位,如有兴趣,请点击Android 架构师查看招聘详情,简历可发送到 dhh@gs-robot.com 邮箱,期待你的到来!

68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d616e64726f69642d627269676874677265656e2e73766768747470733a2f2f6170692e62696e747261792e636f6d2f7061636b616765732f646868616e64726f69642f6d6176656e2f7278776562736f636b65742f696d616765732f646f776e6c6f61642e73766768747470733a2f2f696d672e736869656c64732e696f2f62616467652f4150492d31312532422d626c75652e7376673f7374796c653d666c61742d737175617265687474703a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d417061636865253230322e302d626c75652e7376673f7374796c653d666c61742d737175617265

RxWebSocket是一个基于okhttp和RxJava(RxJava1和RxJava2都有)封装的WebSocket客户端,此库的核心特点是 除了手动关闭WebSocket(就是RxJava取消订阅),WebSocket在异常关闭的时候(onFailure,发生异常,如WebSocketException等等),会自动重连,永不断连.其次,对WebSocket做的缓存处理,同一个URL,共享一个WebSocket.

效果图

WebSocket.gif

断网重连测试

8f7c509df91c0a661abb4f5a882b55d2.gif

how to use

添加依赖:

在项目module下gradle加入:

implementation 'com.dhh:websocket:2.1.2'

init

//init config 在使用RxWebSocket之前设置即可,推荐在application里初始化

Config config = new Config.Builder()

.setShowLog(true) //show log

.setClient(yourClient) //if you want to set your okhttpClient

.setShowLog(true, "your logTag")

.setReconnectInterval(2, TimeUnit.SECONDS) //set reconnect interval

.setSSLSocketFactory(yourSSlSocketFactory, yourX509TrustManager) // wss support

.build();

RxWebSocket.setConfig(config);

WSS support,其实就是设置okhttp的SSL,请参照okhttp的设置,请参照上面Config配置

心跳检测:需要设置自己的okhttpClient,在上面的Config里设置心跳间隔:

Config config = new Config.Builder()

.setClient(new OkHttpClient.Builder()

.pingInterval(3, TimeUnit.SECONDS) // 设置心跳间隔,这个是3秒检测一次

.build()) //if you want to set your okhttpClient

.build();

open WebSocket:和RxJava调用一样,回调请使用项目里提供的 WebSocketSubscriber,WebSocketSubscriber是一个没有抽象方法的抽象类,根据业务需求,重写你想使用的回调

RxWebSocket.get("url")

.subscribe(new WebSocketSubscriber() {

@Override

protected void onMessage(@NonNull String text) {

}

});

RxWebSocket.get("your url")

//RxLifecycle : https://github.com/dhhAndroid/RxLifecycle

.compose(RxLifecycle.with(this).bindToLifecycle())

.subscribe(new WebSocketSubscriber() {

@Override

public void onOpen(@NonNull WebSocket webSocket) {

Log.d("MainActivity", "onOpen1:");

}

@Override

public void onMessage(@NonNull String text) {

Log.d("MainActivity", "返回数据:" + text);

}

@Override

public void onMessage(@NonNull ByteString byteString) {

}

@Override

protected void onReconnect() {

Log.d("MainActivity", "重连:");

}

@Override

protected void onClose() {

Log.d("MainActivity", "onClose:");

}

});

如果你想将String类型的text解析成具体的实体类,请使用 WebSocketSubscriber2

/**

*

*如果你想将String类型的text解析成具体的实体类,比如{@link List},

* 请使用 {@link WebSocketSubscriber2},仅需要将泛型传入即可

*/

RxWebSocket.get("your url")

.compose(RxLifecycle.with(this).bindToLifecycle())

.subscribe(new WebSocketSubscriber2>() {

@Override

protected void onMessage(List strings) {

}

});

发送消息

//用WebSocket的引用直接发

mWebSocket.send("hello word");

//url 对应的WebSocket 必须打开,否则报错

RxWebSocket.send(url, "hello");

RxWebSocket.send(url, ByteString.EMPTY);

//异步发送,若WebSocket已经打开,直接发送,若没有打开,打开一个WebSocket发送完数据,直接关闭.

RxWebSocket.asyncSend(url, "hello");

RxWebSocket.asyncSend(url, ByteString.EMPTY);

注销

RxJava的注销方式,就可以取消订阅.

Subscription subscription = RxWebSocket.get("ws://sdfs").subscribe();

//注销

if(subscription!=null&&!subscription.isUnsubscribed()) {

subscription.unsubscribe();

}

更优雅的注销处理方式,请看我的另一个项目: RxLife,优雅地处理RxJava注销问题,和Activity生命周期绑定.

如果本库对你有帮助,谢谢您的star!

RxJava交流群

RxJava%E4%BA%A4%E6%B5%81%E7%BE%A4%E7%BE%A4%E4%BA%8C%E7%BB%B4%E7%A0%81.png

License

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OkHttp 中使用 WebSocket 进行通信时,可以通过 `WebSocket.send()` 方法来发送消息,而通过 `WebSocket.close()` 方法来主动关闭连接。如果想要判断 WebSocket 是否还在连接服务器,可以通过 `WebSocket.send()` 方法返回的布尔值来判断,如果返回 false,则表示 WebSocket 连接已经断开了。 如果 WebSocket 连接已经断开,可以通过 `WebSocket.close()` 方法来关闭 WebSocket,然后通过 `OkHttpClient.newWebSocket()` 方法重新创建一个新的 WebSocket 对象并建立连接,从而实现重连。 下面是一个简单的示例代码: ```java WebSocket webSocket = null; Request request = new Request.Builder().url("ws://localhost:8080").build(); public void connectWebSocket() { OkHttpClient client = new OkHttpClient(); webSocket = client.newWebSocket(request, new WebSocketListener() { @Override public void onOpen(WebSocket webSocket, Response response) { // WebSocket 连接成功 } @Override public void onMessage(WebSocket webSocket, String text) { // 接收到消息 } @Override public void onClosed(WebSocket webSocket, int code, String reason) { // WebSocket 连接关闭 webSocket.close(1000, null); // 关闭 WebSocket connectWebSocket(); // 重新连接 WebSocket } @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { // WebSocket 连接失败 } }); } public void sendMessage(String message) { if (webSocket != null && webSocket.send(message)) { // 发送消息成功 } else { // WebSocket 连接已经断开 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值