Closed synchroni closed 6 years ago
服务器不用告诉前端断连,APP重启才能连上,说明APP端代码写的有问题,你先看下readme相关说明,是否是配置不对,导致没有重连。也可以把代码贴一下,我看看。
初始化
Config config = new Config.Builder().setReconnectInterval(2, TimeUnit.SECONDS).build(); RxWebSocket.setConfig(config);
在onResume中
RxWebSocket.get(WebSocketURL + SystemUtil.geDeviceSerial())
.compose(RxLifecycle.with(this).<WebSocketInfo>bindToLifecycle())
.subscribe(new WebSocketSubscriber() {
@Override
public void onOpen(@NonNull WebSocket webSocket) {
Log.e("JzgTV", "onOpen1:");
tv_reconnect.setVisibility(View.GONE);
}
@Override
public void onMessage(@NonNull String text) {
Log.e("JzgTV", "返回数据:" + text);
if (CommonUtils.TextIsEmpty(text) && "jzgtv_success".equals(text) && !mFinish) {
// Router.newIntent(context).to(AgentWebViewActivity.class).launch();
Router.newIntent(context).to(WebViewActivity.class).launch();
}
}
@Override
protected void onReconnect() {
Log.e("JzgTV", "重连:" + WebSocketURL + SystemUtil.geDeviceSerial());
tv_reconnect.setVisibility(View.VISIBLE);
}
@Override
protected void onClose() {
Log.e("JzgTV", "onClose:");
}
});
@Override protected void onDestroy() { super.onDestroy();
//注销
Disposable disposable = RxWebSocket.get(WebSocketURL).subscribe();
if (!disposable.isDisposed()) {
disposable.dispose();
}
}
就只有这些,你看对吗。
在onDestroy里的代码,不用写,你在onResume里用RxLifecycle的BindToLifecycle是自动注销的,RxLifecycle需要在application里初始化
Config配置没有加日志打印,你开启日志开关,看下日志
试试这个config,显示 RxWebsocket内部日志,并且有心跳检测
Config config = new Config.Builder()
.setShowLog(true) //show log
.setClient(new OkHttpClient.Builder()
.pingInterval(3, TimeUnit.SECONDS) // 设置心跳间隔,这个是3秒检测一次
.build()) //if you want to set your okhttpClient
.setReconnectInterval(1, TimeUnit.SECONDS) //set reconnect interval
.build();
加了,初始化也完成,我断网测试重连是有Log的,刚才我又重启了服务器,是没有任何Log过来,也没有任何回调。不能确定是否真的断连了。 但如果我重启app或者刷新一下生命周期,就能连上。
好的。我试试
是否解决问题,都给我反馈一下,还有一种设置timeout的方式,也可以用的
配合上面的config,获取Websocket的时候用这个方法:
RxWebSocket.get(WebSocketURL + SystemUtil.geDeviceSerial(),10,TimeUnit.SECONDS)
还有你说的重启服务器,是把服务器关闭吗?还是说,服务器发送了一个关闭WebSocket的指令(服务端调用了websocket.close())?
我问过服务器,他说就是服务器关闭重启(就是重新布属服务器代码),没有特别发送指令说 close了。。
但是服务器说当重启的时候能看到服务器那边的WebSocket默认会发送一条close命令,是WebSocket自已执行的。
按照你说的 RxWebSocket.get(WebSocketURL + SystemUtil.geDeviceSerial(),10,TimeUnit.SECONDS) 这要样的意思是10秒重连一次吗?。我看log是这样的。这样是正常的吗?。是不管有没有连接都会十秒重连一次?.
差不多是这样,这个和ping/pong机制差不多,这个timeout是多少秒没有接收到数据,就重连一次,时间长短自己取舍。
按照你最后的办法,现在服务器重启是可以重连了,但有一点就是我上面说的,已经连接成功的时候,会十秒一次的走onReconnect() 和onOpen()回调(注:先走onReconnect()再走onOpen())。这样会造成性能浪费吗。
最开始的时候我集成的你的这个,可以不用这样就可以立马知道服务器重启,然后自动重启,不用加这个心跳机制,今天才突然发现这个问题的,刚开始集成的时候是没有问题的。- -。,
我这个库,在自己项目里使用,是可以重连的,断网、服务器重启我都试过,都是可以的。这个timeout,是在断网后,手机或平板设备响应不及时,没有及时发送连接失败通知(小米平板就是这样),导致重连不及时,我才做的这个timeout折中处理,这个会开启/关闭WebSocket,性能的话,应该影响不大,这个我没测过。但是框架内部是保证同一个url在同一时间是只有一个WebSocket连接的。如果真不行,你只能另觅他路了。
服务器重启会发送Close()指令 ,你那边会吗?。
问你们服务端,我这边服务端不发送关闭命令,框架内部是接收到服务端的关闭指令,就关闭WebSocket,当时这样写的原因是,我认为服务端要关闭,就没有必要重连了。
现在十秒一次的访问 会出一个内部错误 E/JzgTV: java.io.IOException: closed/websocket/app/PFSNU17C21113716 知道这是啥原因吗,websocket/app/PFSNU17C21113716这一段是我url的参数。
这个我不清楚
如题,服务器重启后,前端不会发启重连,是服务器需要告诉前端断连了吗?要重启app才能连接上。