package org.menacheri.zombie; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import org.jboss.netty.bootstrap.ClientBootstrap; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelFutureListener; import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; import org.menacheri.jetserver.event.Events; import org.menacheri.jetserver.util.NettyUtils; public class ZombieClient { public static final ScheduledExecutorService SERVICE; public static final Map<Integer, InetSocketAddress> CHANNEL_ID_ADDRESS_MAP; static { SERVICE = Executors.newSingleThreadScheduledExecutor(); CHANNEL_ID_ADDRESS_MAP = new HashMap<Integer, InetSocketAddress>(); Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run() { SERVICE.shutdown(); } }); } public static void main(String[] args) throws UnknownHostException { String host = "localhost"; int port = 18090; ChannelFactory factory = new NioClientSocketChannelFactory(Executors .newCachedThreadPool(), Executors.newCachedThreadPool()); final DefenderHandler defHandler = new DefenderHandler(); PipelineFactory defFactory = new PipelineFactory(defHandler); final ZombieHandler zomHandler = new ZombieHandler(); PipelineFactory zomFactory = new PipelineFactory(zomHandler); ClientBootstrap bootstrap = new ClientBootstrap(factory); // At client side option is tcpNoDelay and at server child.tcpNoDelay bootstrap.setOption("tcpNoDelay", true); bootstrap.setOption("keepAlive", true); for (int i = 1; i<=50;i++){ final InetSocketAddress udpLocalAddress; if(i%2==0){ bootstrap.setPipelineFactory(defFactory); udpLocalAddress = defHandler.connectLocal(); }else{ bootstrap.setPipelineFactory(zomFactory); udpLocalAddress = zomHandler.connectLocal(); } ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port)); future.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { ChannelBuffer loginBuffer = getLoginBuffer("Zombie_ROOM_1_REF_KEY_1",writeSocketAddressToBuffer(udpLocalAddress)); Channel channel = future.getChannel(); CHANNEL_ID_ADDRESS_MAP.put(channel.getId(), udpLocalAddress); channel.write(loginBuffer); } }); } } public static ChannelBuffer getLoginBuffer(String refKey, ChannelBuffer udpAddress) { ChannelBuffer opcode = ChannelBuffers.buffer(1); ChannelBuffer protocol = ChannelBuffers.buffer(1); opcode.writeByte(Events.LOG_IN); protocol.writeByte(Events.PROTCOL_VERSION); String username = "user"; String password = "pass"; // write username,password and ref key. ChannelBuffer buffer = ChannelBuffers.wrappedBuffer(opcode,protocol, NettyUtils.writeStrings(username,password,refKey),udpAddress); return buffer; } public static ChannelBuffer writeSocketAddressToBuffer(InetSocketAddress localAddress){ ChannelBuffer hostName = NettyUtils.writeString(localAddress .getHostName()); ChannelBuffer portNum = ChannelBuffers.buffer(4); portNum.writeInt(localAddress.getPort()); ChannelBuffer socketAddress = ChannelBuffers.wrappedBuffer(hostName, portNum); return socketAddress; } }