Проверка состояния

195
23 января 2018, 11:37

У меня есть сервер и клиент.(Написанные на Java). Они общаются между собой путем отправки пакетов. Проблема заключается в том что если клиент выходит из программы то серверу отсылается пакет с данными. Проблема в том что если клиент внезапно выйдет(упадет отключится,цунами,потом,ураган) то серверу не отправится пакет об отключений клиента. И он будет считать что он подключен. На netty как мне говорят создается канал по которому если обрывается связь то он умирает.Возможно ли это реализовать в Java? Была идея отправлять каждую секунду от сервера клиенту пакет с данными "ping" и если ответ от клиента будет "pong" то продолжать с ним работу. Если ответа не будет то удалять его из сервера как работающего.

Что вы мне посоветует? Я плохо конечно разбираюсь в сокетах(пока что) Но там можно от сервера принимать подключения а клиент может подлючаться и получать информацию. Только я в этом не понял что будет если закрыть соеденение. Будет ли сообщение клиенту и серверу о разрыве соеденения?

Answer 1

В "Netty in Action" есть глава посвящённая этой теме. Код оттуда:

public class IdleStateHandlerInitializer extends ChannelInitializer<Channel> {
    @Override
    protected void initChannel(Channel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        pipeline.addLast(new IdleStateHandler(0, 0, 60, TimeUnit.SECONDS));
        pipeline.addLast(new HeartbeatHandler());
    }
    public static final class HeartbeatHandler extends ChannelStateHandlerAdapter {
        private static final ByteBuf HEARTBEAT_SEQUENCE =
            Unpooled.unreleasableBuffer(Unpooled.copiedBuffer("HEARTBEAT",
                CharsetUtil.ISO_8859_1));
        @Override
        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
            if (evt instanceof IdleStateEvent) {
                ctx.writeAndFlush(HEARTBEAT_SEQUENCE.duplicate())
                    .addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
            } else {
                super.userEventTriggered(ctx, evt);
            }
        }
    }
}
READ ALSO
Обновление фрагментов View Pager

Обновление фрагментов View Pager

Как можно обновить все фрагменты view pager? То есть чтобы фрагменты создались заново, в том числе текущий

200
Обрезать ссылки до имени файла

Обрезать ссылки до имени файла

Есть некоторе количество ссылок на файлы, которые лежат в блоках (div > li > a)Их надо обрезать до названия файла, т

227