*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布
一 . 概述
1. RxWebSocket是一个基于okhttp和RxJava(RxJava1和RxJava2都支持)封装的WebSocket客户端,此库的核心特点是 除了手动关闭WebSocket(就是RxJava取消订阅),WebSocket在异常关闭的时候(onFailure,发生异常,如WebSocketException等等),会自动重连,永不断连.其次,对WebSocket做的缓存处理,同一个URL,共享一个WebSocket.
2. 由于是基于RxJava封装,所以带来了无限可能,可以和RxBinding,Rxlifecycle一起使用,方便对WebSocket的管理.
项目地址: 欢迎star
重连
项目已经上传Jcenter,依赖方法:
compile 'com.dhh:websocket:1.3.0'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'io.reactivex:rxjava:1.3.1'
compile 'io.reactivex:rxandroid:1.2.1'
二 . 使用方法
0. 初始化,可以也忽略直接使用.
如果你想使用自己的okhttpClient:
OkHttpClient yourClient = new OkHttpClient()
RxWebSocketUtil.getInstance().setClient(yourClient)
是否打印日志:
RxWebSocketUtil.getInstance().setShowLog(BuildConfig.DEBUG)
1.获取一个WebSocket,接收消息,多种方式:
RxWebSocketUtil.getInstance().getWebSocketInfo(url)
.subscribe(new Action1<WebSocketInfo>() {
@Override
public void call(WebSocketInfo webSocketInfo) {
mWebSocket = webSocketInfo.getWebSocket();
Log.d("MainActivity", webSocketInfo.getString());
Log.d("MainActivity", "ByteString:" + webSocketInfo.getByteString());
}
});
mWebSocket.send("hello word");
RxWebSocketUtil.getInstance().getWebSocketString(url)
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
}
});
RxWebSocketUtil.getInstance().getWebSocketByteString(url)
.subscribe(new Action1<ByteString>() {
@Override
public void call(ByteString byteString) {
}
});
RxWebSocketUtil.getInstance().getWebSocket(url)
.subscribe(new Action1<WebSocket>() {
@Override
public void call(WebSocket webSocket) {
}
});
RxWebSocketUtil.getInstance().getWebSocketInfo(url,10, TimeUnit.SECONDS)
.subscribe(new Action1<WebSocketInfo>() {
@Override
public void call(WebSocketInfo webSocketInfo) {
}
});
2. 发送消息:
//用WebSocket的引用直接发
mWebSocket.send("hello word")
//url 对应的WebSocket已经打开可以这样send,否则报错
RxWebSocketUtil.getInstance().send(url, "hello")
RxWebSocketUtil.getInstance().send(url, ByteString.EMPTY)
//异步发送,若WebSocket已经打开,直接发送,若没有打开,打开一个WebSocket发送完数据,直接关闭.
RxWebSocketUtil.getInstance().asyncSend(url, "hello")
RxWebSocketUtil.getInstance().asyncSend(url, ByteString.EMPTY)