diff --git a/src/ei/engine/network/NioClient.java b/src/ei/engine/network/NioClient.java index 3e8ed18..b17b9b8 100644 --- a/src/ei/engine/network/NioClient.java +++ b/src/ei/engine/network/NioClient.java @@ -8,6 +8,7 @@ import java.nio.channels.SocketChannel; import java.nio.channels.spi.SelectorProvider; import ei.engine.network.response.ResponseEvent; +import ei.engine.network.util.Converter; public class NioClient extends NioNetwork{ @@ -32,4 +33,8 @@ public class NioClient extends NioNetwork{ SocketChannel socket = initiateConnection(new InetSocketAddress(hostAddress, port)); send(socket, handler, data); } + + public void send(ResponseEvent handler, Object data) throws IOException { + send(handler, Converter.toBytes(data)); + } } diff --git a/src/ei/engine/network/NioNetwork.java b/src/ei/engine/network/NioNetwork.java index d2cac57..83ee990 100644 --- a/src/ei/engine/network/NioNetwork.java +++ b/src/ei/engine/network/NioNetwork.java @@ -16,9 +16,13 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import ei.engine.network.message.Message; +import ei.engine.network.message.StringMessage; +import ei.engine.network.message.type.SystemMessage; import ei.engine.network.response.PrintRsp; import ei.engine.network.response.ResponseEvent; import ei.engine.network.server.ClientData; +import ei.engine.network.util.Converter; import ei.engine.network.worker.EchoWorker; import ei.engine.network.worker.Worker; import ei.engine.util.MultiPrintStream; @@ -40,6 +44,7 @@ public abstract class NioNetwork implements Runnable { // The buffer into which we'll read data when it's available protected ByteBuffer readBuffer = ByteBuffer.allocate(8192); protected Worker worker; + protected Worker systemWorker; // This map contains all the clients that are conncted protected Map clients = new HashMap(); @@ -82,6 +87,23 @@ public abstract class NioNetwork implements Runnable { this.worker = worker; } + + public void send(SocketChannel socket, Object data) { + send(socket, Converter.toBytes(data)); + } + + public void send(InetSocketAddress address, Object data){ + send(address, Converter.toBytes(data)); + } + + public void send(InetSocketAddress address, byte[] data){ + send(getSocketChannel(address), data); + } + + public void send(SocketChannel socket, ResponseEvent handler, Object data) throws IOException { + send(socket, handler, Converter.toBytes(data)); + } + public void send(SocketChannel socket, ResponseEvent handler, byte[] data) throws IOException { // Register the response handler rspEvents.put(socket, handler); @@ -103,10 +125,6 @@ public abstract class NioNetwork implements Runnable { } } - public void send(InetSocketAddress address, byte[] data){ - send(getSocketChannel(address), data); - } - /** * Queues the message to be sent and wakeups the selector * @@ -171,9 +189,11 @@ public abstract class NioNetwork implements Runnable { } else if (key.isReadable()) { read(key); + //System.out.println("Reading"); } else if (key.isWritable()) { write(key); + //System.out.println("Writing"); } } } @@ -235,17 +255,32 @@ public abstract class NioNetwork implements Runnable { return; } - if(rspEvents.get(socketChannel) != null){ + // Make a correctly sized copy of the data before handing it + // to the client + byte[] rspByteData = new byte[numRead]; + System.arraycopy(readBuffer.array(), 0, rspByteData, 0, numRead); + + Object rspData = Converter.toObject(rspByteData); + + if(rspData instanceof SystemMessage){ + if(systemWorker != null){ + systemWorker.processData(this, socketChannel, rspData); + } + else{ + System.out.println("Unhandled System Message!!!"); + } + } + else if(rspEvents.get(socketChannel) != null){ // Handle the response - handleResponse(socketChannel, readBuffer.array(), numRead); + handleResponse(socketChannel, rspData); } else{ // Hand the data off to our worker thread if(worker != null){ - worker.processData(this, socketChannel, readBuffer.array(), numRead); + worker.processData(this, socketChannel, rspData); } else{ - System.out.println("Unhandled Message Removed!!!"); + System.out.println("Unhandled Message!!!"); } } } @@ -279,12 +314,8 @@ public abstract class NioNetwork implements Runnable { /** * Client And Server ResponseEvent */ - private void handleResponse(SocketChannel socketChannel, byte[] data, int numRead) throws IOException { - // Make a correctly sized copy of the data before handing it - // to the client - byte[] rspData = new byte[numRead]; - System.arraycopy(data, 0, rspData, 0, numRead); - + private void handleResponse(SocketChannel socketChannel, Object rspData) throws IOException { + // Look up the handler for this channel ResponseEvent handler = (ResponseEvent) rspEvents.get(socketChannel); @@ -348,30 +379,4 @@ public abstract class NioNetwork implements Runnable { // Register an interest in writing on this channel key.interestOps(SelectionKey.OP_WRITE); } - - public static void main(String[] args) { - try { - EchoWorker worker = new EchoWorker(); - new Thread(worker).start(); - NioNetwork server = new NioServer(null, 9090); - server.setWorker(worker); - new Thread(server).start(); - - NioClient client = new NioClient(InetAddress.getByName("localhost"), 9090); - Thread t = new Thread(client); - t.setDaemon(false); - t.start(); - for(int i=0;;i++){ - PrintRsp handler = new PrintRsp(); - client.send(handler, ("LOL: "+i).getBytes()); - handler.waitForResponse(); - System.out.println("sending"); - } - } catch (IOException e) { - e.printStackTrace(); - } - -System.out.println("closing"); - - } } diff --git a/src/ei/engine/network/message/StringMessage.java b/src/ei/engine/network/message/StringMessage.java new file mode 100644 index 0000000..a7acf1d --- /dev/null +++ b/src/ei/engine/network/message/StringMessage.java @@ -0,0 +1,23 @@ +package ei.engine.network.message; + +public class StringMessage extends Message { + private static final long serialVersionUID = 1L; + + private String msg; + + public StringMessage(String msg){ + this.msg = msg; + } + + public String getString(){ + return msg; + } + + public void setString(String msg){ + this.msg = msg; + } + + public String toString(){ + return getString(); + } +} diff --git a/src/ei/engine/network/response/PrintRsp.java b/src/ei/engine/network/response/PrintRsp.java index c3d2c1e..63a2533 100644 --- a/src/ei/engine/network/response/PrintRsp.java +++ b/src/ei/engine/network/response/PrintRsp.java @@ -3,8 +3,8 @@ package ei.engine.network.response; public class PrintRsp extends ResponseEvent{ @Override - protected void responseEvent(byte[] rsp) { - System.out.println(new String(rsp)); + protected void responseEvent(Object rsp) { + System.out.println(rsp); } } diff --git a/src/ei/engine/network/response/ResponseEvent.java b/src/ei/engine/network/response/ResponseEvent.java index 99c0f60..510ebd4 100644 --- a/src/ei/engine/network/response/ResponseEvent.java +++ b/src/ei/engine/network/response/ResponseEvent.java @@ -2,9 +2,9 @@ package ei.engine.network.response; public abstract class ResponseEvent { - private byte[] rsp = null; + private Object rsp = null; - public synchronized boolean handleResponse(byte[] rsp) { + public synchronized boolean handleResponse(Object rsp) { this.rsp = rsp; notify(); return true; @@ -31,5 +31,5 @@ public abstract class ResponseEvent { return (rsp != null); } - protected abstract void responseEvent(byte[] rsp); + protected abstract void responseEvent(Object rsp); } diff --git a/src/ei/engine/network/util/Converter.java b/src/ei/engine/network/util/Converter.java index 7fa9d44..640921b 100644 --- a/src/ei/engine/network/util/Converter.java +++ b/src/ei/engine/network/util/Converter.java @@ -48,4 +48,20 @@ public class Converter { } return object; } + + /** + * Checks if the given interface is implemented in the object + * @param object The object to look for the interface + * @param interf The interface to look for + * @return True if the interface is implemented else false + */ + public static boolean isInstanceOf(Object object, Class interf){ + Class[] objectInterf = object.getClass().getInterfaces(); + for(int i=0; i queue = new LinkedList(); - public void processData(NioNetwork server, SocketChannel socket, byte[] data, int count) { - byte[] dataCopy = new byte[count]; - System.arraycopy(data, 0, dataCopy, 0, count); + public void processData(NioNetwork server, SocketChannel socket, Object data) { synchronized(queue) { - queue.add(new WorkerDataEvent(server, socket, dataCopy)); + queue.add(new WorkerDataEvent(server, socket, data)); queue.notify(); } } diff --git a/src/ei/engine/network/worker/WorkerDataEvent.java b/src/ei/engine/network/worker/WorkerDataEvent.java index b80ae62..7d22a93 100644 --- a/src/ei/engine/network/worker/WorkerDataEvent.java +++ b/src/ei/engine/network/worker/WorkerDataEvent.java @@ -7,9 +7,9 @@ import ei.engine.network.NioNetwork; class WorkerDataEvent { public NioNetwork network; public SocketChannel socket; - public byte[] data; + public Object data; - public WorkerDataEvent(NioNetwork server, SocketChannel socket, byte[] data) { + public WorkerDataEvent(NioNetwork server, SocketChannel socket, Object data) { this.network = server; this.socket = socket; this.data = data; diff --git a/src/ei/engine/test/NetworkClient.java b/src/ei/engine/test/NetworkClient.java new file mode 100644 index 0000000..387e04a --- /dev/null +++ b/src/ei/engine/test/NetworkClient.java @@ -0,0 +1,27 @@ +package ei.engine.test; + +import java.io.IOException; +import java.net.InetAddress; + +import ei.engine.network.NioClient; +import ei.engine.network.message.StringMessage; +import ei.engine.network.response.PrintRsp; + +public class NetworkClient { + public static void main(String[] args) { + try { + NioClient client = new NioClient(InetAddress.getByName("localhost"), 6056); + Thread t = new Thread(client); + t.setDaemon(false); + t.start(); + for(int i=0;;i++){ + PrintRsp handler = new PrintRsp(); + client.send(handler, new StringMessage("StringMessage: "+i)); + handler.waitForResponse(); + //System.out.println("sending"); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/ei/engine/test/NetworkServer.java b/src/ei/engine/test/NetworkServer.java new file mode 100644 index 0000000..f987f3f --- /dev/null +++ b/src/ei/engine/test/NetworkServer.java @@ -0,0 +1,21 @@ +package ei.engine.test; + +import java.io.IOException; + +import ei.engine.network.NioNetwork; +import ei.engine.network.NioServer; +import ei.engine.network.worker.EchoWorker; + +public class NetworkServer { + public static void main(String[] args) { + try { + EchoWorker worker = new EchoWorker(); + new Thread(worker).start(); + NioNetwork server = new NioServer(null, 6056); + server.setWorker(worker); + new Thread(server).start(); + } catch (IOException e) { + e.printStackTrace(); + } + } +}