Atmosphere / wasync

WebSockets with fallback transports client library for Node.js, Android and Java
http://async-io.org
161 stars 47 forks source link

Client not trying to reconnect itself, seem like setting DefaultOption object does not work at all. #136

Closed fifanrg closed 7 years ago

fifanrg commented 8 years ago

Trying to write a demo client connecting to atmosphere server, basically modified a little bit base on the demo example, it seems like the DefaultOption is not working at all after I set it.

I am testing network environment change (switch environment & no network) after connection has been open. It gives me connection "timed out error" right away after I kill the network.

Exception I am getting : 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ android.system.ErrnoException: recvfrom failed: ETIMEDOUT (Connection timed out) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at libcore.io.Posix.recvfromBytes(Native Method) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at libcore.io.Posix.recvfrom(Posix.java:175) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:245) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at libcore.io.IoBridge.recvfrom(IoBridge.java:565) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at java.nio.SocketChannelImpl.readImpl(SocketChannelImpl.java:342) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at java.nio.SocketChannelImpl.read(SocketChannelImpl.java:304) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:64) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 11-19 12:26:32.877 12637-12696/se.elabs.websocketexampleclient W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

Example code :

try { AtmosphereClient client = ClientFactory.getDefault().newClient(AtmosphereClient.class);

        RequestBuilder request = client.newRequestBuilder()
                .method(Request.METHOD.GET)
                .uri(url + "/chat/chat")
                .trackMessageLength(true)
                .encoder(new Encoder<MessageData, String>() {
                    @Override
                    public String encode(MessageData data) {
                        Gson gson = new Gson();
                        return gson.toJson(data, MessageData.class);
                    }
                })
                .decoder(new Decoder<String, MessageData>() {
                    @Override
                    public MessageData decode(Event type, String data) {

// Log.v("websocket", " decode : " + data);

                        data = data.trim();

                        // Padding
                        if (data.length() == 0) {
                            return null;
                        }

                        if (type.equals(Event.CLOSE)) {
                            Log.v("websocket", " close : " + data);

                        }

                        if (type.equals(Event.REOPENED)) {
                            Log.v("websocket", " REOPENED : " + data);
                        }

                        if (type.equals(Event.MESSAGE)) {
                            Gson gson = new Gson();
                            return gson.fromJson(data, MessageData.class);
                        } else {
                            return null;
                        }
                    }
                })
                .transport(Request.TRANSPORT.WEBSOCKET)
                .transport(Request.TRANSPORT.LONG_POLLING);

        DefaultOptions options = client.newOptionsBuilder().reconnect(true)
                .requestTimeoutInSeconds(200)
                .reconnectAttempts(3)
                .pauseBeforeReconnectInSeconds(10)
                .build();

        atmosphereSocketClient  = client.create(options);

        atmosphereSocketClient.on("message", new Function<MessageData>() {
            @Override
            public void on(final MessageData t) {
                String message = t.getAuthor() + " : " + t.getMessage();
                webSocketEventListener.onSocketReceivedMessage(message);

            }
        }).on(new Function<Throwable>() {

            @Override
            public void on(Throwable t) {

                t.printStackTrace();
            }

        }).on(Event.OPEN.name(), new Function<String>() {
            @Override
            public void on(String o) {
                Log.v("websocket", " on  Open : " + o);
                state = CONNECTION_STATE.CONNECTED;
                webSocketEventListener.onSocketConnected(null);

            }
        }).on(Event.CLOSE.name(), new Function<String>() {
            @Override
            public void on(String o) {
                Log.v("websocket", " on  close : " + o);

            }
        }).on(Event.REOPENED.name(), new Function<String>() {
            @Override
            public void on(String o) {
                Log.v("websocket", " on  Reopen : " + o);

            }
        }).open(request.build(),200, TimeUnit.SECONDS);

// socket.fire(new Message(name, str));

    } catch (Throwable e) {
        Log.v("websocket"," error : " + e.getMessage());
        e.printStackTrace();
    }
manikantag commented 8 years ago

This might be similar to https://github.com/Atmosphere/wasync/issues/133

I've identified the root cause, but fix is required

jfarcand commented 8 years ago

@manikantag Contribution welcomed :-)

thabach commented 7 years ago

133 should also have fixed this.