1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.netty.example.haproxy;
18
19 import io.netty.bootstrap.ServerBootstrap;
20 import io.netty.buffer.ByteBuf;
21 import io.netty.buffer.ByteBufUtil;
22 import io.netty.channel.ChannelHandlerContext;
23 import io.netty.channel.ChannelInitializer;
24 import io.netty.channel.EventLoopGroup;
25 import io.netty.channel.MultiThreadIoEventLoopGroup;
26 import io.netty.channel.SimpleChannelInboundHandler;
27 import io.netty.channel.nio.NioIoHandler;
28 import io.netty.channel.socket.SocketChannel;
29 import io.netty.channel.socket.nio.NioServerSocketChannel;
30 import io.netty.handler.codec.haproxy.HAProxyMessage;
31 import io.netty.handler.codec.haproxy.HAProxyMessageDecoder;
32 import io.netty.handler.logging.LogLevel;
33 import io.netty.handler.logging.LoggingHandler;
34
35 public final class HAProxyServer {
36
37 static final int PORT = Integer.parseInt(System.getProperty("port", "8080"));
38
39 public static void main(String[] args) throws Exception {
40 EventLoopGroup bossGroup = new MultiThreadIoEventLoopGroup(1, NioIoHandler.newFactory());
41 EventLoopGroup workerGroup = new MultiThreadIoEventLoopGroup(NioIoHandler.newFactory());
42 try {
43 ServerBootstrap b = new ServerBootstrap();
44 b.group(bossGroup, workerGroup)
45 .channel(NioServerSocketChannel.class)
46 .handler(new LoggingHandler(LogLevel.INFO))
47 .childHandler(new HAProxyServerInitializer());
48 b.bind(PORT).sync().channel().closeFuture().sync();
49 } finally {
50 bossGroup.shutdownGracefully();
51 workerGroup.shutdownGracefully();
52 }
53 }
54
55 static class HAProxyServerInitializer extends ChannelInitializer<SocketChannel> {
56 @Override
57 public void initChannel(SocketChannel ch) throws Exception {
58 ch.pipeline().addLast(
59 new LoggingHandler(LogLevel.DEBUG),
60 new HAProxyMessageDecoder(),
61 new SimpleChannelInboundHandler() {
62 @Override
63 protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
64 if (msg instanceof HAProxyMessage) {
65 System.out.println("proxy message: " + msg);
66 } else if (msg instanceof ByteBuf) {
67 System.out.println("bytebuf message: " + ByteBufUtil.prettyHexDump((ByteBuf) msg));
68 }
69 }
70 });
71 }
72 }
73 }