Я хочу отправить строки 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