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.TimeUnit; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelUpstreamHandler; import org.jboss.netty.channel.socket.DatagramChannel; import org.menacheri.jetserver.event.Events; import org.menacheri.jetserver.event.Event; import org.menacheri.zombie.domain.IAM; public class ZombieHandler extends SimpleChannelUpstreamHandler { private static final IAM I_AM = IAM.ZOMBIE; private static final Map<InetSocketAddress, DatagramChannel> CLIENTS = new HashMap<InetSocketAddress, DatagramChannel>(); private final UDPClient udpClient; public ZombieHandler() { udpClient = new UDPClient(this, I_AM, "255.255.255.255", 18090, Executors.newCachedThreadPool()); } @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { Object message = e.getMessage(); if (message instanceof Event) { Event event = (Event) message; if (Events.START == event.getType()) { // TCP write to server WriteByte write = new WriteByte(e.getChannel(), null, IAM.ZOMBIE); ZombieClient.SERVICE.scheduleAtFixedRate(write, 2000l, 500l, TimeUnit.MILLISECONDS); // For UDP write to server connectUDP(e.getChannel()); } else if (Events.LOG_IN_SUCCESS == event.getType()) { } else if (Events.NETWORK_MESSAGE == event.getType()) { ChannelBuffer buffer = (ChannelBuffer) event.getSource(); if (buffer.readableBytes() >= 4) { System.out .println("UDP event from server in ZombieHandler: " + buffer.readInt()); } else { System.out .println("UDP Event does not have expected data in ZombieHandler"); } } else { super.messageReceived(ctx, e); } } } public InetSocketAddress connectLocal() throws UnknownHostException { DatagramChannel c = udpClient.createDatagramChannel(); InetSocketAddress localAddress = udpClient.getLocalAddress(c); CLIENTS.put(localAddress, c); return localAddress; } public void connectUDP(Channel channel) { InetSocketAddress address = ZombieClient.CHANNEL_ID_ADDRESS_MAP.get(channel.getId()); System.out.println("UDP address for connect UDP: " + address); final DatagramChannel c = CLIENTS.get(address); if ((udpClient != null) && (c != null)) { // Connect the UDP System.out.println("Going to connect UDP in ZombieHandler"); Runnable runnable = new Runnable() { @Override public void run() { udpClient.start(c); } }; ZombieClient.SERVICE.submit(runnable); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { System.out.println("\nException caught in class ZombieHandler"); System.out.println(e.getCause()); e.getChannel().close(); } }