dhhAndroid / RxWebSocket

An auto reconnection-webSocket build with okhttp and rxJava
http://blog.csdn.net/huiAndroid/article/details/78071703
740 stars 114 forks source link

服务器重启,前端不会发启重连,是服务器需要告诉前端断连了吗?要重启app才能连接上。 #27

Closed synchroni closed 6 years ago

synchroni commented 6 years ago

如题,服务器重启后,前端不会发启重连,是服务器需要告诉前端断连了吗?要重启app才能连接上。

dhhAndroid commented 6 years ago

服务器不用告诉前端断连,APP重启才能连上,说明APP端代码写的有问题,你先看下readme相关说明,是否是配置不对,导致没有重连。也可以把代码贴一下,我看看。

synchroni commented 6 years ago

初始化

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();
    }
}

就只有这些,你看对吗。

dhhAndroid commented 6 years ago

在onDestroy里的代码,不用写,你在onResume里用RxLifecycle的BindToLifecycle是自动注销的,RxLifecycle需要在application里初始化

dhhAndroid commented 6 years ago

Config配置没有加日志打印,你开启日志开关,看下日志

dhhAndroid commented 6 years ago

试试这个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();
synchroni commented 6 years ago

加了,初始化也完成,我断网测试重连是有Log的,刚才我又重启了服务器,是没有任何Log过来,也没有任何回调。不能确定是否真的断连了。 但如果我重启app或者刷新一下生命周期,就能连上。

synchroni commented 6 years ago

好的。我试试

dhhAndroid commented 6 years ago

是否解决问题,都给我反馈一下,还有一种设置timeout的方式,也可以用的

synchroni commented 6 years ago
dhhAndroid commented 6 years ago

配合上面的config,获取Websocket的时候用这个方法:

   RxWebSocket.get(WebSocketURL + SystemUtil.geDeviceSerial(),10,TimeUnit.SECONDS)

还有你说的重启服务器,是把服务器关闭吗?还是说,服务器发送了一个关闭WebSocket的指令(服务端调用了websocket.close())?

synchroni commented 6 years ago

我问过服务器,他说就是服务器关闭重启(就是重新布属服务器代码),没有特别发送指令说 close了。。

synchroni commented 6 years ago

但是服务器说当重启的时候能看到服务器那边的WebSocket默认会发送一条close命令,是WebSocket自已执行的。

synchroni commented 6 years ago

按照你说的 RxWebSocket.get(WebSocketURL + SystemUtil.geDeviceSerial(),10,TimeUnit.SECONDS) 这要样的意思是10秒重连一次吗?。我看log是这样的。这样是正常的吗?。是不管有没有连接都会十秒重连一次?.

dhhAndroid commented 6 years ago

差不多是这样,这个和ping/pong机制差不多,这个timeout是多少秒没有接收到数据,就重连一次,时间长短自己取舍。

synchroni commented 6 years ago

按照你最后的办法,现在服务器重启是可以重连了,但有一点就是我上面说的,已经连接成功的时候,会十秒一次的走onReconnect() 和onOpen()回调(注:先走onReconnect()再走onOpen())。这样会造成性能浪费吗。

synchroni commented 6 years ago

最开始的时候我集成的你的这个,可以不用这样就可以立马知道服务器重启,然后自动重启,不用加这个心跳机制,今天才突然发现这个问题的,刚开始集成的时候是没有问题的。- -。,

dhhAndroid commented 6 years ago

我这个库,在自己项目里使用,是可以重连的,断网、服务器重启我都试过,都是可以的。这个timeout,是在断网后,手机或平板设备响应不及时,没有及时发送连接失败通知(小米平板就是这样),导致重连不及时,我才做的这个timeout折中处理,这个会开启/关闭WebSocket,性能的话,应该影响不大,这个我没测过。但是框架内部是保证同一个url在同一时间是只有一个WebSocket连接的。如果真不行,你只能另觅他路了。

synchroni commented 6 years ago

服务器重启会发送Close()指令 ,你那边会吗?。

dhhAndroid commented 6 years ago

问你们服务端,我这边服务端不发送关闭命令,框架内部是接收到服务端的关闭指令,就关闭WebSocket,当时这样写的原因是,我认为服务端要关闭,就没有必要重连了。

synchroni commented 6 years ago

现在十秒一次的访问 会出一个内部错误 E/JzgTV: java.io.IOException: closed/websocket/app/PFSNU17C21113716 知道这是啥原因吗,websocket/app/PFSNU17C21113716这一段是我url的参数。

dhhAndroid commented 6 years ago

这个我不清楚