@TheRevan

Как передать объект через netty?

Как передать обьект по сети, интересуют примеры реализации, желательно на версии 4 и выше. Зачем нужен encoder и decoder, если преобразования к Pocket происходят не в них(в последних версиях)
  • Вопрос задан
  • 1214 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Кодеки, в том числе кодеры и декодеры, нужны как раз для того, чтобы преобразовывать данные поступающие в канал и выходящие из него. Можно всё это в одном обработчике делать, но разделение логики и следование принципам фреймворка облегчает отладку и сопровождение кода. Я не знаю, что такое Pocket, но в последних версиях кодеки используются так же, как и в предыдущих.

Person.java
import java.io.Serializable;

public class Person implements Serializable {
    private final Long id;
    private String name;

    public Person(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public String toString() {
        return getName();
    }
}


SimpleClient.java
public class SimpleClient {
    public static void main(String[] args) throws Exception {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            new Bootstrap().group(group)
                           .channel(NioSocketChannel.class)
                           .handler(new ChannelInitializer<SocketChannel>() {
                                @Override
                                public void initChannel(SocketChannel socketChannel) {
                                    ChannelPipeline pipeline = socketChannel.pipeline();
                                    pipeline.addLast(new ObjectEncoder());
                                    pipeline.addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(null)));
                                    pipeline.addLast(new ChannelInboundHandlerAdapter() {
                                        @Override
                                        public void channelActive(ChannelHandlerContext ctx) throws Exception {
                                            ctx.writeAndFlush(new Person(1L, "John"));
                                        }

                                        @Override
                                        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                            Person person = (Person) msg;
                                            System.out.println(person);
                                        }
                                    });
                                }
                            })
                            .connect("localhost", 8080)
                            .sync()
                            .channel()
                            .closeFuture()
                            .sync();

        } finally {
            group.shutdownGracefully();
        }
    }
}


SimpleServer.java
public class SimpleServer {
    public static void main(String[] args) throws Exception {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            new ServerBootstrap().group(group)
                                 .channel(NioServerSocketChannel.class)
                                 .childHandler(new ChannelInitializer<SocketChannel>() {
                                    @Override
                                    public void initChannel(SocketChannel socketChannel) {
                                        ChannelPipeline pipeline = socketChannel.pipeline();
                                        pipeline.addLast(new ObjectEncoder());
                                        pipeline.addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(null)));
                                        pipeline.addLast(new ChannelInboundHandlerAdapter() {
                                            @Override
                                            public void channelRead(ChannelHandlerContext ctx, Object msg) {
                                                Person person = (Person) msg;
                                                System.out.println(person);

                                                person.setName("John Doe");
                                                ctx.writeAndFlush(person)
                                                   .addListener(ChannelFutureListener.CLOSE);
                                            }

                                            @Override
                                            public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
                                                cause.printStackTrace();
                                                ctx.channel().close();
                                            }
                                        });
                                    }
                                 })
                                 .bind("localhost", 8080)
                                 .sync()
                                 .channel()
                                 .closeFuture()
                                 .syncUninterruptibly();

        } finally {
            group.shutdownGracefully();
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы