diff --git a/java/base/src/main/java/base/Control.java b/java/base/src/main/java/base/Control.java new file mode 100644 index 0000000..ca16751 --- /dev/null +++ b/java/base/src/main/java/base/Control.java @@ -0,0 +1,7 @@ +package base; + +public interface Control { + public void start(); + public void stop(); + public void exit(); +} diff --git a/java/base/src/main/java/base/receiver/Forwarder.java b/java/base/src/main/java/base/receiver/Forwarder.java new file mode 100644 index 0000000..d390c48 --- /dev/null +++ b/java/base/src/main/java/base/receiver/Forwarder.java @@ -0,0 +1,8 @@ +package base.receiver; + +import base.Control; + +public interface Forwarder extends Control { + public void register(Receiver receiver); + public void remove(Receiver receiver); +} diff --git a/java/base/src/main/java/base/receiver/Receiver.java b/java/base/src/main/java/base/receiver/Receiver.java new file mode 100644 index 0000000..4dd22a6 --- /dev/null +++ b/java/base/src/main/java/base/receiver/Receiver.java @@ -0,0 +1,7 @@ +package base.receiver; + +public interface Receiver { + + public void receive(byte[] buffer); + +} diff --git a/java/base/src/main/java/base/sender/Sender.java b/java/base/src/main/java/base/sender/Sender.java index a92a541..7491400 100644 --- a/java/base/src/main/java/base/sender/Sender.java +++ b/java/base/src/main/java/base/sender/Sender.java @@ -2,6 +2,8 @@ package base.sender; import java.io.IOException; -public interface Sender { +import base.Control; + +public interface Sender extends Control { public void send(byte[] buffer) throws IOException; } diff --git a/java/base/src/main/java/base/sender/UdpSender.java b/java/base/src/main/java/base/sender/UdpSender.java index 1abecae..0f5babf 100644 --- a/java/base/src/main/java/base/sender/UdpSender.java +++ b/java/base/src/main/java/base/sender/UdpSender.java @@ -30,19 +30,7 @@ public class UdpSender implements Sender { } protected boolean setup() { - if (datagramSocket == null) { - try { - datagramSocket = new DatagramSocket(); - } catch (SocketException e) { - logger.error("Failed to create socket", e); - return false; - } - Runtime.getRuntime().addShutdownHook(new Thread() { - public void run() { - datagramSocket.close(); - } - }); - } + return true; } @@ -55,4 +43,24 @@ public class UdpSender implements Sender { logger.error("Failed to send buffer", e); } } + + public void start() { + if (datagramSocket == null) { + try { + datagramSocket = new DatagramSocket(); + } catch (SocketException e) { + logger.error("Failed to create socket", e); + } + } + } + + public void stop() { + if (datagramSocket != null) { + datagramSocket.close(); + } + } + + public void exit() { + stop(); + } } diff --git a/java/base/src/main/java/base/server/channel/TcpClient.java b/java/base/src/main/java/base/server/channel/TcpClient.java index 77ef722..125db67 100644 --- a/java/base/src/main/java/base/server/channel/TcpClient.java +++ b/java/base/src/main/java/base/server/channel/TcpClient.java @@ -17,7 +17,7 @@ import base.work.Listen; import base.work.Work; import base.worker.Worker; -public abstract class TcpClient extends Work implements Sender { +public class TcpClient extends Work implements Sender { protected static final String HOST = "localhost"; protected static final int BUFFER_SIZE = 1024; @@ -109,7 +109,7 @@ public abstract class TcpClient extends Work implements Sender { } } - protected abstract void input(byte[] buffer); + protected void input(byte[] buffer) {} public void send(byte[] buffer) throws IOException { if (selector == null) { diff --git a/java/base/src/main/java/base/server/datagram/UdpServer.java b/java/base/src/main/java/base/server/datagram/UdpServer.java index f59ef77..2367f1a 100644 --- a/java/base/src/main/java/base/server/datagram/UdpServer.java +++ b/java/base/src/main/java/base/server/datagram/UdpServer.java @@ -8,7 +8,7 @@ import java.net.SocketException; import base.exception.worker.ActivateException; import base.work.Work; -public abstract class UdpServer extends Work { +public class UdpServer extends Work { protected static final int BUFFER_SIZE = 1024; protected static final int TIMEOUT = 1000; @@ -60,5 +60,5 @@ public abstract class UdpServer extends Work { input(buffer); } - protected abstract void input(byte[] buffer); + protected void input(byte[] buffer) {} } diff --git a/java/base/src/main/java/base/server/forwarder/TcpServerChannelForwarder.java b/java/base/src/main/java/base/server/forwarder/TcpServerChannelForwarder.java new file mode 100644 index 0000000..1296081 --- /dev/null +++ b/java/base/src/main/java/base/server/forwarder/TcpServerChannelForwarder.java @@ -0,0 +1,31 @@ +package base.server.forwarder; + +import java.util.ArrayList; + +import base.receiver.Forwarder; +import base.receiver.Receiver; +import base.server.channel.TcpServer; +import base.server.channel.TcpServerClient; + +public class TcpServerChannelForwarder extends TcpServer implements Forwarder { + protected ArrayList receiverList; + + public TcpServerChannelForwarder(int port) { + super(port); + receiverList = new ArrayList(); + } + + public void register(Receiver receiver) { + receiverList.add(receiver); + } + + public void remove(Receiver receiver) { + receiverList.remove(receiver); + } + + public void input(TcpServerClient client, byte[] buffer) { + for (Receiver receiver: receiverList) { + receiver.receive(buffer); + } + } +} diff --git a/java/base/src/main/java/base/server/forwarder/TcpServerSocketForwarder.java b/java/base/src/main/java/base/server/forwarder/TcpServerSocketForwarder.java new file mode 100644 index 0000000..2bfc7d5 --- /dev/null +++ b/java/base/src/main/java/base/server/forwarder/TcpServerSocketForwarder.java @@ -0,0 +1,31 @@ +package base.server.forwarder; + +import java.util.ArrayList; + +import base.receiver.Forwarder; +import base.receiver.Receiver; +import base.server.socket.TcpServer; +import base.server.socket.TcpServerClient; + +public class TcpServerSocketForwarder extends TcpServer implements Forwarder { + protected ArrayList receiverList; + + public TcpServerSocketForwarder(int port) { + super(port); + receiverList = new ArrayList(); + } + + public void register(Receiver receiver) { + receiverList.add(receiver); + } + + public void remove(Receiver receiver) { + receiverList.remove(receiver); + } + + public void input(TcpServerClient client, byte[] buffer) { + for (Receiver receiver: receiverList) { + receiver.receive(buffer); + } + } +} diff --git a/java/base/src/main/java/base/server/forwarder/UdpServerForwarder.java b/java/base/src/main/java/base/server/forwarder/UdpServerForwarder.java new file mode 100644 index 0000000..3946d4b --- /dev/null +++ b/java/base/src/main/java/base/server/forwarder/UdpServerForwarder.java @@ -0,0 +1,30 @@ +package base.server.forwarder; + +import java.util.ArrayList; + +import base.receiver.Forwarder; +import base.receiver.Receiver; +import base.server.datagram.UdpServer; + +public class UdpServerForwarder extends UdpServer implements Forwarder { + protected ArrayList receiverList; + + public UdpServerForwarder(int port) { + super(port); + receiverList = new ArrayList(); + } + + public void register(Receiver receiver) { + receiverList.add(receiver); + } + + public void remove(Receiver receiver) { + receiverList.remove(receiver); + } + + public void input(byte[] buffer) { + for (Receiver receiver: receiverList) { + receiver.receive(buffer); + } + } +} diff --git a/java/base/src/main/java/base/server/socket/AbstractTcpClient.java b/java/base/src/main/java/base/server/socket/AbstractTcpClient.java index a7cc936..a246508 100644 --- a/java/base/src/main/java/base/server/socket/AbstractTcpClient.java +++ b/java/base/src/main/java/base/server/socket/AbstractTcpClient.java @@ -4,8 +4,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; import base.exception.worker.DeactivateException; import base.sender.Sender; @@ -69,7 +67,6 @@ public abstract class AbstractTcpClient extends Work implements Sender { } } catch (InterruptedException e) {} } - System.out.println("Client writing: " + Charset.defaultCharset().decode(ByteBuffer.wrap(buffer)).toString()); outputStream.write(buffer); } } diff --git a/java/base/src/main/java/base/server/socket/TcpClient.java b/java/base/src/main/java/base/server/socket/TcpClient.java index 6eea5c1..8db979a 100644 --- a/java/base/src/main/java/base/server/socket/TcpClient.java +++ b/java/base/src/main/java/base/server/socket/TcpClient.java @@ -5,8 +5,9 @@ import java.net.Socket; import java.net.UnknownHostException; import base.exception.worker.ActivateException; +import base.sender.Sender; -public abstract class TcpClient extends AbstractTcpClient { +public class TcpClient extends AbstractTcpClient implements Sender { protected static final String HOST = "localhost"; protected String host; @@ -43,4 +44,6 @@ public abstract class TcpClient extends AbstractTcpClient { } super.activate(); } + + protected void input(byte[] buffer) {} } \ No newline at end of file diff --git a/java/base/src/main/java/base/server/socket/TcpServer.java b/java/base/src/main/java/base/server/socket/TcpServer.java index d6cd36a..9a562cb 100644 --- a/java/base/src/main/java/base/server/socket/TcpServer.java +++ b/java/base/src/main/java/base/server/socket/TcpServer.java @@ -52,7 +52,9 @@ public class TcpServer extends Work implements Sender { super.exit(); try { serverSocket.close(); - // Should check if clients exit as well + for (TcpServerClient client : clientList) { + client.exit(); + } } catch (IOException e) { logger.error("", e); } @@ -75,7 +77,7 @@ public class TcpServer extends Work implements Sender { public void send(byte[] buffer) throws IOException { logger.debug("Number of clients = " + clientList.size()); for (TcpServerClient client : clientList) { - // Should be dealt with in clients own thread + // Should be dealt with in clients own thread? client.send(buffer); } } diff --git a/java/base/src/main/java/base/worker/Worker.java b/java/base/src/main/java/base/worker/Worker.java index a1e5c01..098a129 100644 --- a/java/base/src/main/java/base/worker/Worker.java +++ b/java/base/src/main/java/base/worker/Worker.java @@ -25,7 +25,7 @@ public abstract class Worker { public Worker(Work work) { this.work = work; - logger = LoggerFactory.getLogger(work.getClass()); + logger = LoggerFactory.getLogger(work.getClass()); } public boolean active() {