package cn.org.hentai.jtt1078.app; import cn.org.hentai.jtt1078.http.GeneralResponseWriter; import cn.org.hentai.jtt1078.http.NettyHttpServerHandler; import cn.org.hentai.jtt1078.publisher.PublishManager; import cn.org.hentai.jtt1078.server.Jtt1078Handler; import cn.org.hentai.jtt1078.server.Jtt1078MessageDecoder; import cn.org.hentai.jtt1078.server.SessionManager; import cn.org.hentai.jtt1078.util.Configs; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpRequestDecoder; import io.netty.handler.codec.http.HttpResponseEncoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sun.misc.Signal; import sun.misc.SignalHandler; import io.netty.handler.timeout.IdleStateHandler; import java.net.InetAddress; import java.util.concurrent.TimeUnit; /** * Created by matrixy on 2019/4/9. */ public class VideoServerApp { private static Logger logger = LoggerFactory.getLogger(VideoServerApp.class); public static void main(String[] args) throws Exception { Configs.init("/app.properties"); PublishManager.init(); SessionManager.init(); VideoServer videoServer = new VideoServer(); HttpServer httpServer = new HttpServer(); Signal.handle(new Signal("TERM"), new SignalHandler() { @Override public void handle(Signal signal) { videoServer.shutdown(); httpServer.shutdown(); } }); videoServer.start(); httpServer.start(); } static class VideoServer { private static ServerBootstrap serverBootstrap; private static EventLoopGroup bossGroup; private static EventLoopGroup workerGroup; private static void start() throws Exception { serverBootstrap = new ServerBootstrap(); serverBootstrap.option(ChannelOption.SO_BACKLOG, Configs.getInt("server.backlog", 102400)); bossGroup = new NioEventLoopGroup(Configs.getInt("server.worker-count", Runtime.getRuntime().availableProcessors())); workerGroup = new NioEventLoopGroup(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { @Override protected void initChannel(final SocketChannel channel) throws Exception { ChannelPipeline p = channel.pipeline(); // p.addLast(new IdleStateHandler(10,0,0, TimeUnit.SECONDS)); p.addLast(new Jtt1078MessageDecoder()); // p.addLast(new Jtt808MessageEncoder()); // p.addLast(new JTT808Handler()); p.addLast(new Jtt1078Handler()); } }); int port = Configs.getInt("server.port", 1078); Channel ch = serverBootstrap.bind(InetAddress.getByName("0.0.0.0"), port).sync().channel(); logger.info("Video Server started at: {}", port); ch.closeFuture(); } private static void shutdown() { try { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } catch(Exception e) { e.printStackTrace(); } } } static class HttpServer { private static ServerBootstrap serverBootstrap; private static EventLoopGroup bossGroup; private static EventLoopGroup workerGroup; private static void start() throws Exception { bossGroup = new NioEventLoopGroup(); workerGroup = new NioEventLoopGroup(Runtime.getRuntime().availableProcessors()); ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast( new GeneralResponseWriter(), new HttpResponseEncoder(), new HttpRequestDecoder(), new HttpObjectAggregator(1024 * 64), new NettyHttpServerHandler() ); } }).option(ChannelOption.SO_BACKLOG, 1024) .childOption(ChannelOption.SO_KEEPALIVE, true); try { int port = Configs.getInt("server.http.port", 3333); ChannelFuture f = bootstrap.bind(InetAddress.getByName("0.0.0.0"), port).sync(); logger.info("HTTP Server started at: {}", port); f.channel().closeFuture().sync(); } catch (InterruptedException e) { logger.error("http server error", e); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } private static void shutdown() { try { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } catch(Exception e) { e.printStackTrace(); } } } }