Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.nmrfx.server; /** * * @author brucejohnson */ import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import java.io.IOException; import java.net.ServerSocket; import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; public class Server implements Runnable { private Consumer consumer; private int port; public Server(int port, Consumer consumer) { this.port = port; this.consumer = consumer; } @Override public void run() { EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1) EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); // (2) b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) // (3) .childHandler(new ChannelInitializer<SocketChannel>() { // (4) @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ServerHandler(consumer)); } }).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) System.out.println("NMRFx server started using port " + port); // 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(); } catch (InterruptedException ex) { Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void startServer(int port, Consumer consumer) { Server server = new Server(port, consumer); Thread myThread = new Thread(server); myThread.start(); } public static int getRandomPort() throws IOException { ServerSocket s = new ServerSocket(0); int port = s.getLocalPort(); s.close(); // System.out.println("random port = " + port); return port; } }