Почему нетти у меня не работает с Spring Boot? - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу отправить строки Json через Интернет, как можно быстрее.Сначала я попробовал REST API в Spring, но это замедлило процесс.Мне нужно что-то быстрее.Потом я нашел Нетти.Я попробовал.

Первый в Spring Boot.Сначала я создал начальный класс запуска для запуска NettyServer

@Component
public class InitialStartUp implements ApplicationListener<ContextRefreshedEvent> {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {


        // Start the Netty server
        try {
            new NettyServer().run();
            logger.info("Starting netty server");
        } catch (Exception e) {
            logger.info(e.getMessage());
        }

    }
}

И NettyServer выглядит следующим образом.Обратите внимание, что у меня есть комментарий f.channel().closeFuture().sync();, потому что в остальном запуск Spring Boot не начнется.Он просто будет стоять на этой линии и ждать.

public class NettyServer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    private int port = 8081;

    public NettyServer() {
    }

    public void run() throws Exception {

        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 1024)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline p = ch.pipeline();
                            p.addLast(new ObjectEncoder());
                            p.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.cacheDisabled(null)));
                            p.addLast(new NettyServerHandler());
                        }
                    });

            // Bind and start to accept incoming connections.
            b.bind(port).sync(); // Used to be ChannelFuture f = b.bind(port).sync();

            logger.info("server bind port:{}", port);

            // Wait until the server socket is closed.
            //f.channel().closeFuture().sync();

        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }

}

Это проблема для меня.Потому что, когда я пытаюсь подключить NettyClient к NettyServer, я могу подключиться, даже если NettyServer настроен на 8081, а NettyClient подключен на 8080.

public class NettyClient {

    private String host;
    private int port;

    public NettyClient(String host, int port) {
        this.host = host;
        this.port = port;
    }

    public void send() throws InterruptedException {

        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
            .channel(NioSocketChannel.class)
            .option(ChannelOption.TCP_NODELAY, true)
            .handler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {

                    ChannelPipeline p = ch.pipeline();
                    p.addLast(new ObjectEncoder());
                    p.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.cacheDisabled(null)));
                    p.addLast(new NettyClientHandler());
                }
            });

            ChannelFuture future = b.connect(host, port).sync();
            future.channel().closeFuture().sync();
        } finally {
            group.shutdownGracefully();
        }
    }

Вопросы:

Я предполагаю, что мне нужно иметь закомментированную строку выше f.channel().closeFuture().sync();, иначе она не будет работать для меня.Но даже если у меня есть эта строка, она все равно не работает с Spring Boot.

Знаете ли вы, как я могу иметь несколько подключений от клиентов к Socket Server и сервер отвечает только при получении сообщения?

Я использую этот пример кода: Пример Pojo Netty

...