Java tutorial
/* * Copyright 2016 higherfrequencytrading.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.openhft.performance.tests.third.party.frameworks.netty; 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 net.openhft.performance.tests.vanilla.tcp.EchoClientMain; import org.jetbrains.annotations.NotNull; /** * Discards any incoming data. */ public class NettyEchoServer { private int port; public NettyEchoServer(int port) { this.port = port; } public void run() throws InterruptedException { @NotNull EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1) @NotNull EventLoopGroup workerGroup = new NioEventLoopGroup(); try { @NotNull ServerBootstrap b = new ServerBootstrap(); // (2) b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) // (3) .childHandler(new ChannelInitializer<SocketChannel>() { // (4) @Override public void initChannel(@NotNull SocketChannel ch) { ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { // echo server @Override public void channelRead(@NotNull ChannelHandlerContext ctx, Object msg) { // (2) ctx.write(msg); // (1) ctx.flush(); // (2) } @Override public void exceptionCaught(@NotNull ChannelHandlerContext ctx, @NotNull Throwable cause) { // (4) // Close the connection when an exception is raised. cause.printStackTrace(); ctx.close(); } }); } }).option(ChannelOption.SO_BACKLOG, 128) // (5) .childOption(ChannelOption.SO_KEEPALIVE, true); // (6) // Bind and start to accept incoming connections. ChannelFuture f = b.bind(port).sync(); // (7) // Wait until the server socket is closed. // In this example, this does not happen, but you can do that to gracefully // shut down your server. f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(@NotNull String[] args) throws InterruptedException { int port; if (args.length > 0) { port = Integer.parseInt(args[0]); } else { port = EchoClientMain.PORT; } new NettyEchoServer(port).run(); } }