1、定义变量
private WebSocket zhiboSocket = null;//socket对象
private boolean isOpen = false;//是否连接成功
2、使用单例
private static ZhiboSocketClient zhiboSocketClient = new ZhiboSocketClient();
private ZhiboSocketClient (){}
private ZhiboSocketClient getInstance(){
return zhiboSocketClient ;
}
3、建立连接
private void connectsocket() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.callTimeout(5, TimeUnit.SECONDS)
.pingInterval(10, TimeUnit.SECONDS)//发送心跳保活用的 不需要自己额外发送
.readTimeout(BaseConfig.CONNECT_TIME_OUT, BaseConfig.TIME_TYPE)
.build();
Request request = new Request
.Builder()
.url(BaseConfig.zbWsUrl)
.build();
zhiboSocket = okHttpClient.newWebSocket(request, new WebSocketListener() {
@Override
public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) {
isOpen = false;
EventBus.getDefault().post(new ZhiboWsEvent(ZhiboStatus.WSFAILURE));
}
@Override
public void onClosing(@NotNull WebSocket webSocket, int code, @NotNull String reason) {
isOpen = false;
EventBus.getDefault().post(new ZhiboWsEvent(ZhiboStatus.WSCLOSE));
}
@Override
public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, @Nullable Response response) {
isOpen = false;
EventBus.getDefault().post(new ZhiboWsEvent(ZhiboStatus.WSFAILURE));
}
@Override
public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) {
isOpen = true;
if(!text.isEmpty()){
ZbWsMsgVo<Map<String,Object>> json = JSON.parseObject(text,new TypeReference<ZbWsMsgVo<Map<String,Object>>>(){});
EventBus.getDefault().post(json);
}
}
@Override
public void onMessage(@NotNull WebSocket webSocket, @NotNull ByteString bytes) {
isOpen = true;
}
@Override
public void onOpen(@NotNull WebSocket webSocket, @NotNull Response response) {
isOpen = true;
EventBus.getDefault().post(new ZhiboWsEvent(ZhiboStatus.WSOPEN));
}
});
}
4、断线重连
private void closeAndReConnect(){
try {
if(!isOpen){
zhiboSocket.cancel();
zhiboSocket = null;
connectsocket();
}
}catch (Exception e){
e.printStackTrace();
}
}
5、是否已经建立连接
public boolean socketIsOpen(){
return zhiboSocket!=null&&isOpen;
}
6、关闭socket服务
public void finish() {
try {
if(zhiboSocket!=null){
zhiboSocket.cancel();
zhiboSocket = null;
}
}catch (Exception e){
e.printStackTrace();
}
}