Added test classes for the networking and made so that the network engine sends object insted of raw data
This commit is contained in:
parent
a0363aa3d8
commit
16b9f1f265
11 changed files with 161 additions and 53 deletions
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<InetSocketAddress, ClientData> clients = new HashMap<InetSocketAddress, ClientData>();
|
||||
|
|
@ -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");
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
23
src/ei/engine/network/message/StringMessage.java
Normal file
23
src/ei/engine/network/message/StringMessage.java
Normal file
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<objectInterf.length ;i++){
|
||||
if(objectInterf[i] == interf){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,24 @@
|
|||
package ei.engine.network.worker;
|
||||
|
||||
import ei.engine.network.NioNetwork;
|
||||
|
||||
public class SystemWorker extends Worker {
|
||||
|
||||
public SystemWorker(NioNetwork nio){
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try{
|
||||
Thread.sleep(1000);
|
||||
}catch(Exception e){}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,11 +9,9 @@ import ei.engine.network.NioNetwork;
|
|||
public abstract class Worker implements Runnable {
|
||||
private List<WorkerDataEvent> queue = new LinkedList<WorkerDataEvent>();
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
27
src/ei/engine/test/NetworkClient.java
Normal file
27
src/ei/engine/test/NetworkClient.java
Normal file
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
21
src/ei/engine/test/NetworkServer.java
Normal file
21
src/ei/engine/test/NetworkServer.java
Normal file
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue