org.rzo.netty.ahessian.bootstrap.DefaultServer.java Source code

Java tutorial

Introduction

Here is the source code for org.rzo.netty.ahessian.bootstrap.DefaultServer.java

Source

/*******************************************************************************
 * Copyright  2015 rzorzorzo@users.sf.net
 *
 * 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 org.rzo.netty.ahessian.bootstrap;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.ServerChannel;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.oio.OioEventLoopGroup;
import io.netty.util.concurrent.DefaultEventExecutorGroup;
import io.netty.util.concurrent.EventExecutorGroup;

import java.net.InetSocketAddress;
import java.util.Set;

public class DefaultServer extends DefaultEndpoint {

    ServerBootstrap bootstrap;
    EventLoopGroup bossGroup;
    EventLoopGroup childGroup;
    EventExecutorGroup internalGroup;
    int _port;

    private static final int IPTOS_THROUGHPUT = 0x08;
    private static final int IPTOS_LOWDELAY = 0x10;

    public DefaultServer(Class serverChannelClass, ChannelPipelineFactoryFactory factory,
            Set<String> channelOptions, int port) {
        if (!ServerChannel.class.isAssignableFrom(serverChannelClass))
            throw new RuntimeException("serverChannelClass must implement ServerChannel");

        // Configure the server.
        bootstrap = new ServerBootstrap();
        _port = port;
        internalGroup = new DefaultEventExecutorGroup(10);

        if (isNio(serverChannelClass)) {
            bossGroup = new NioEventLoopGroup();
            childGroup = new NioEventLoopGroup();
        } else if (isOio(serverChannelClass)) {
            bossGroup = new OioEventLoopGroup();
            childGroup = new OioEventLoopGroup();
        } else {
            bossGroup = new NioEventLoopGroup();
            childGroup = new NioEventLoopGroup();
        }
        bootstrap.group(bossGroup, childGroup);
        bootstrap.channel(serverChannelClass);
        // bootstrap.setOption("child.trafficClass", IPTOS_LOWDELAY);
        // bootstrap.setOption("child.tcpNoDelay", false);
        // bootstrap.childOption(ChannelOption.IP_TOS, IPTOS_THROUGHPUT);
        setChannelOptions(channelOptions);
        bootstrap.option(ChannelOption.SO_BACKLOG, 100);
        ChannelPipelineFactory channelPipelineFactory = factory.create(internalGroup, bootstrap);
        bootstrap.childHandler(channelPipelineFactory);

    }

    private void setChannelOptions(Set<String> channelOptions) {
        if (channelOptions == null)
            return;
        // TODO add more options
        if (channelOptions.contains("IPTOS_THROUGHPUT"))
            bootstrap.childOption(ChannelOption.IP_TOS, IPTOS_THROUGHPUT);
        else if (channelOptions.contains("IPTOS_LOWDELAY"))
            bootstrap.childOption(ChannelOption.IP_TOS, IPTOS_LOWDELAY);
        else if (channelOptions.contains("TCP_NODELAY"))
            bootstrap.childOption(ChannelOption.TCP_NODELAY, true);
        else if (channelOptions.contains("SO_REUSE"))
            bootstrap.childOption(ChannelOption.SO_REUSEADDR, true);

    }

    @Override
    public void start() throws Exception {
        _channel = bootstrap.bind(new InetSocketAddress(_port)).sync().channel();
    }

    @Override
    void stop() throws Exception {
        getChannel().close().sync();
        bossGroup.shutdownGracefully();
        childGroup.shutdownGracefully();

    }

}