package com.feeyo.net.udp;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ConnectionlessBootstrap;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.FixedReceiveBufferSizePredictor;
import org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory;
import org.jboss.netty.channel.socket.DatagramChannel;
import org.jboss.netty.channel.socket.nio.NioDatagramChannelFactory;


/**
 * UDP Server
 * 
 * @author zhuam
 *  
 */
public class UdpServer {
	
	private ConnectionlessBootstrap bootstrap;
	private DatagramChannel datagramChannel;

	public void startup(int port) {
		
		ChannelFactory channelFactory = new NioDatagramChannelFactory(Executors.newCachedThreadPool());
		
		bootstrap = new ConnectionlessBootstrap( channelFactory );
		bootstrap.setOption("reuseAddress", false);
		bootstrap.setOption("child.reuseAddress", false);		
		bootstrap.setOption("readBufferSize", 1024 * 1024 * 15); //15M
		bootstrap.setOption("writeBufferSize", 1024 * 20);		
		bootstrap.setOption("receiveBufferSizePredictor", new FixedReceiveBufferSizePredictor(1024 * 3));
		bootstrap.setOption("receiveBufferSizePredictorFactory", new FixedReceiveBufferSizePredictorFactory(1024 * 3));
		bootstrap.setPipelineFactory( new ChannelPipelineFactory() {
			@Override
			public ChannelPipeline getPipeline() throws Exception {
				ChannelPipeline pipeline = Channels.pipeline();
				pipeline.addLast("handler", new UdpServerChannelHandler());
				return pipeline;
			}			
		});		
		datagramChannel = (DatagramChannel) bootstrap.bind( new InetSocketAddress( port ) );
	}
	
	public void close() {
		
		if ( datagramChannel != null && datagramChannel.isOpen() ) {
			datagramChannel.close();
			datagramChannel = null;
		}
		
		if ( bootstrap != null ) {
			bootstrap.releaseExternalResources();
		}
	}

}