1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty5.example.echo;
17
18 import io.netty5.bootstrap.ServerBootstrap;
19 import io.netty5.channel.Channel;
20 import io.netty5.channel.ChannelInitializer;
21 import io.netty5.channel.ChannelOption;
22 import io.netty5.channel.ChannelPipeline;
23 import io.netty5.channel.EventLoopGroup;
24 import io.netty5.channel.MultithreadEventLoopGroup;
25 import io.netty5.channel.nio.NioHandler;
26 import io.netty5.channel.socket.SocketChannel;
27 import io.netty5.channel.socket.nio.NioServerSocketChannel;
28 import io.netty5.handler.logging.LogLevel;
29 import io.netty5.handler.logging.LoggingHandler;
30 import io.netty5.handler.ssl.SslContext;
31 import io.netty5.handler.ssl.SslContextBuilder;
32 import io.netty5.handler.ssl.util.SelfSignedCertificate;
33
34
35
36
37 public final class EchoServer {
38
39 static final boolean SSL = System.getProperty("ssl") != null;
40 static final int PORT = Integer.parseInt(System.getProperty("port", "8007"));
41
42 public static void main(String[] args) throws Exception {
43
44 final SslContext sslCtx;
45 if (SSL) {
46 SelfSignedCertificate ssc = new SelfSignedCertificate();
47 sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build();
48 } else {
49 sslCtx = null;
50 }
51
52
53 EventLoopGroup bossGroup = new MultithreadEventLoopGroup(1, NioHandler.newFactory());
54 EventLoopGroup workerGroup = new MultithreadEventLoopGroup(NioHandler.newFactory());
55 final EchoServerHandler serverHandler = new EchoServerHandler();
56 try {
57 ServerBootstrap b = new ServerBootstrap();
58 b.group(bossGroup, workerGroup)
59 .channel(NioServerSocketChannel.class)
60 .option(ChannelOption.SO_BACKLOG, 100)
61 .handler(new LoggingHandler(LogLevel.INFO))
62 .childHandler(new ChannelInitializer<SocketChannel>() {
63 @Override
64 public void initChannel(SocketChannel ch) throws Exception {
65 ChannelPipeline p = ch.pipeline();
66 if (sslCtx != null) {
67 p.addLast(sslCtx.newHandler(ch.bufferAllocator()));
68 }
69
70 p.addLast(serverHandler);
71 }
72 });
73
74
75 Channel channel = b.bind(PORT).asStage().get();
76
77
78 channel.closeFuture().asStage().sync();
79 } finally {
80
81 bossGroup.shutdownGracefully();
82 workerGroup.shutdownGracefully();
83 }
84 }
85 }