1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.example.http2.file;
17
18 import io.netty.bootstrap.ServerBootstrap;
19 import io.netty.channel.Channel;
20 import io.netty.channel.EventLoopGroup;
21 import io.netty.channel.nio.NioEventLoopGroup;
22 import io.netty.channel.socket.nio.NioServerSocketChannel;
23 import io.netty.handler.codec.http2.Http2SecurityUtil;
24 import io.netty.handler.logging.LogLevel;
25 import io.netty.handler.logging.LoggingHandler;
26 import io.netty.handler.ssl.ApplicationProtocolConfig;
27 import io.netty.handler.ssl.ApplicationProtocolNames;
28 import io.netty.handler.ssl.SslContext;
29 import io.netty.handler.ssl.SslContextBuilder;
30 import io.netty.handler.ssl.SslProvider;
31 import io.netty.handler.ssl.SupportedCipherSuiteFilter;
32 import io.netty.handler.ssl.util.SelfSignedCertificate;
33
34 public final class Http2StaticFileServer {
35
36 private static final int PORT = Integer.parseInt(System.getProperty("port", "8443"));
37
38 public static void main(String[] args) throws Exception {
39 SelfSignedCertificate ssc = new SelfSignedCertificate();
40 SslContext sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey())
41 .sslProvider(SslProvider.JDK)
42 .ciphers(Http2SecurityUtil.CIPHERS, SupportedCipherSuiteFilter.INSTANCE)
43 .applicationProtocolConfig(new ApplicationProtocolConfig(
44 ApplicationProtocolConfig.Protocol.ALPN,
45
46 ApplicationProtocolConfig.SelectorFailureBehavior.NO_ADVERTISE,
47
48 ApplicationProtocolConfig.SelectedListenerFailureBehavior.ACCEPT,
49 ApplicationProtocolNames.HTTP_2,
50 ApplicationProtocolNames.HTTP_1_1))
51 .build();
52
53 EventLoopGroup bossGroup = new NioEventLoopGroup(2);
54 EventLoopGroup workerGroup = new NioEventLoopGroup(4);
55 try {
56 ServerBootstrap b = new ServerBootstrap();
57 b.group(bossGroup, workerGroup)
58 .channel(NioServerSocketChannel.class)
59 .handler(new LoggingHandler(LogLevel.INFO))
60 .childHandler(new Http2StaticFileServerInitializer(sslCtx));
61
62 Channel ch = b.bind(PORT).sync().channel();
63
64 System.out.println("Open your web browser and navigate to https://127.0.0.1:" + PORT + '/');
65
66 ch.closeFuture().sync();
67 } finally {
68 bossGroup.shutdownGracefully();
69 workerGroup.shutdownGracefully();
70 }
71 }
72 }