diff --git a/ChatApp/app/src/main/java/client/Client.java b/ChatApp/app/src/main/java/client/Client.java index be21f4e..370fa84 100644 --- a/ChatApp/app/src/main/java/client/Client.java +++ b/ChatApp/app/src/main/java/client/Client.java @@ -1,9 +1,9 @@ package client; -import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; +import network.Socket; import network.protocol.packets.*; public class Client { @@ -12,7 +12,7 @@ public class Client { private final ClientListener callback; public Client(InetSocketAddress serverAddress, ClientListener callback, String pseudo) throws SocketException { - this.connexion = new ClientConnexion(new DatagramSocket(), serverAddress, callback); + this.connexion = new ClientConnexion(new Socket(), serverAddress, callback); this.callback = callback; login(pseudo); } diff --git a/ChatApp/app/src/main/java/client/ClientConnexion.java b/ChatApp/app/src/main/java/client/ClientConnexion.java index 9edadfc..63d34b2 100644 --- a/ChatApp/app/src/main/java/client/ClientConnexion.java +++ b/ChatApp/app/src/main/java/client/ClientConnexion.java @@ -1,12 +1,10 @@ package client; import java.io.IOException; -import java.net.DatagramSocket; import java.net.InetSocketAddress; import network.PacketHandler; -import network.SocketReader; -import network.SocketWriter; +import network.Socket; import network.protocol.Packet; import network.protocol.PacketVisitor; import network.protocol.packets.*; @@ -14,16 +12,15 @@ import network.protocol.packets.*; public class ClientConnexion implements PacketVisitor, PacketHandler { private final InetSocketAddress serverAddress; - private final SocketWriter writer; - private final SocketReader reader; + private final Socket socket; private final ClientListener callback; private volatile boolean connected = false; - public ClientConnexion(DatagramSocket socket, InetSocketAddress serverAddress, ClientListener callback) { + public ClientConnexion(Socket socket, InetSocketAddress serverAddress, ClientListener callback) { this.serverAddress = serverAddress; - this.writer = new SocketWriter(socket); - this.reader = new SocketReader(socket, this); + this.socket = socket; this.callback = callback; + this.socket.addHandler(this); spamHandshake(); } @@ -48,12 +45,12 @@ public class ClientConnexion implements PacketVisitor, PacketHandler { } public void close() { - this.reader.stop(); + this.socket.close(); } public void sendPacket(Packet packet) { try { - this.writer.sendPacket(packet, serverAddress); + this.socket.sendPacket(packet, serverAddress); } catch (IOException e) { this.close(); this.callback.handleConnexionError(); diff --git a/ChatApp/app/src/main/java/network/Socket.java b/ChatApp/app/src/main/java/network/Socket.java new file mode 100644 index 0000000..e7573d2 --- /dev/null +++ b/ChatApp/app/src/main/java/network/Socket.java @@ -0,0 +1,90 @@ +package network; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetSocketAddress; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import network.protocol.Packet; + +public class Socket { + private final DatagramSocket socket; + private final List handlers; + private final Thread readThread; + + public Socket() throws SocketException { + this.socket = new DatagramSocket(); + this.handlers = new ArrayList<>(); + this.readThread = new Thread(this::readLoop); + this.readThread.start(); + } + + public Socket(int listeningPort) throws SocketException { + this.socket = new DatagramSocket(listeningPort); + this.handlers = new ArrayList<>(); + this.readThread = new Thread(this::readLoop); + this.readThread.start(); + } + + public void addHandler(PacketHandler handler) { + this.handlers.add(handler); + } + + public int getLocalPort() { + return this.socket.getLocalPort(); + } + + public void sendPacket(Packet packet, InetSocketAddress address) throws IOException { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(stream); + oos.writeObject(packet); + oos.flush(); + byte[] data = stream.toByteArray(); + DatagramPacket dataPacket = new DatagramPacket(data, data.length, address.getAddress(), + address.getPort()); + this.socket.send(dataPacket); + } + + public Entry recievePacket() throws IOException, ClassNotFoundException { + byte[] buffer = new byte[65535]; + DatagramPacket dataPacket = new DatagramPacket(buffer, buffer.length); + socket.receive(dataPacket); + + InetSocketAddress address = new InetSocketAddress(dataPacket.getAddress(), dataPacket.getPort()); + + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(dataPacket.getData())); + Packet packet = (Packet) ois.readObject(); + + return Map.entry(packet, address); + } + + public void close() { + this.socket.close(); + } + + private void handlePacket(Packet packet, InetSocketAddress address) { + for (PacketHandler handler : this.handlers) { + handler.handlePacket(packet, address); + } + } + + private void readLoop() { + try { + while (!Thread.interrupted()) { + var entry = this.recievePacket(); + this.handlePacket(entry.getKey(), entry.getValue()); + } + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } +} diff --git a/ChatApp/app/src/main/java/network/SocketReader.java b/ChatApp/app/src/main/java/network/SocketReader.java deleted file mode 100644 index 334e72c..0000000 --- a/ChatApp/app/src/main/java/network/SocketReader.java +++ /dev/null @@ -1,49 +0,0 @@ -package network; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetSocketAddress; - -import network.protocol.Packet; - -public class SocketReader { - - private final DatagramSocket socket; - private final Thread readThread; - private final PacketHandler handler; - - public SocketReader(DatagramSocket socket, PacketHandler handler) { - this.socket = socket; - this.handler = handler; - this.readThread = new Thread(this::readLoop); - this.readThread.start(); - } - - public void stop() { - this.readThread.interrupt(); - socket.close(); - } - - private void readLoop() { - while (!Thread.interrupted()) { - try { - byte[] buffer = new byte[65535]; - DatagramPacket dataPacket = new DatagramPacket(buffer, buffer.length); - socket.receive(dataPacket); - - InetSocketAddress address = new InetSocketAddress(dataPacket.getAddress(), dataPacket.getPort()); - - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(dataPacket.getData())); - Packet packet = (Packet) ois.readObject(); - - this.handler.handlePacket(packet, address); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - } - -} diff --git a/ChatApp/app/src/main/java/network/SocketWriter.java b/ChatApp/app/src/main/java/network/SocketWriter.java deleted file mode 100644 index 54c4d41..0000000 --- a/ChatApp/app/src/main/java/network/SocketWriter.java +++ /dev/null @@ -1,30 +0,0 @@ -package network; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetSocketAddress; - -import network.protocol.Packet; - -public class SocketWriter { - - private final DatagramSocket socket; - - public SocketWriter(DatagramSocket socket) { - this.socket = socket; - } - - public void sendPacket(Packet packet, InetSocketAddress address) throws IOException { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(stream); - oos.writeObject(packet); - oos.flush(); - byte[] data = stream.toByteArray(); - DatagramPacket dataPacket = new DatagramPacket(data, data.length, address.getAddress(), - address.getPort()); - this.socket.send(dataPacket); - } -} diff --git a/ChatApp/app/src/main/java/server/Server.java b/ChatApp/app/src/main/java/server/Server.java index 376e5d8..7e97072 100644 --- a/ChatApp/app/src/main/java/server/Server.java +++ b/ChatApp/app/src/main/java/server/Server.java @@ -1,6 +1,5 @@ package server; -import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; import java.time.Instant; @@ -9,7 +8,7 @@ import java.util.HashMap; import java.util.Map; import network.PacketHandler; -import network.SocketReader; +import network.Socket; import network.protocol.ANSIColor; import network.protocol.Packet; import network.protocol.packets.ChatMessagePacket; @@ -17,17 +16,16 @@ import network.protocol.packets.SendChatMessagePacket; public class Server implements PacketHandler { - private final DatagramSocket serverSocket; + private final Socket serverSocket; private final Map connexions; private final Map connexionTimes; - private final SocketReader reader; private final Map> rooms; public Server(int port) throws SocketException { - this.serverSocket = new DatagramSocket(port); + this.serverSocket = new Socket(port); + this.serverSocket.addHandler(this); this.connexions = new HashMap<>(); this.connexionTimes = new HashMap<>(); - this.reader = new SocketReader(serverSocket, this); this.rooms = new HashMap<>(); } @@ -101,7 +99,7 @@ public class Server implements PacketHandler { } public void close() { - this.reader.stop(); + this.serverSocket.close(); } public boolean hasChatterName(String pseudo) { diff --git a/ChatApp/app/src/main/java/server/ServerConnexion.java b/ChatApp/app/src/main/java/server/ServerConnexion.java index fd27855..cd3fcd4 100644 --- a/ChatApp/app/src/main/java/server/ServerConnexion.java +++ b/ChatApp/app/src/main/java/server/ServerConnexion.java @@ -1,11 +1,10 @@ package server; import java.io.IOException; -import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.time.Instant; -import network.SocketWriter; +import network.Socket; import network.protocol.Packet; import network.protocol.PacketVisitor; import network.protocol.packets.*; @@ -15,13 +14,13 @@ public class ServerConnexion implements PacketVisitor { private final Server server; private final InetSocketAddress clientAddress; - private final SocketWriter writer; + private final Socket socket; private String chatterName; - public ServerConnexion(Server server, DatagramSocket socket, InetSocketAddress clientAddress) { + public ServerConnexion(Server server, Socket socket, InetSocketAddress clientAddress) { this.clientAddress = clientAddress; this.server = server; - this.writer = new SocketWriter(socket); + this.socket = socket; } public String getChatterName() { @@ -30,7 +29,7 @@ public class ServerConnexion implements PacketVisitor { public void sendPacket(Packet packet) { try { - this.writer.sendPacket(packet, clientAddress); + this.socket.sendPacket(packet, clientAddress); } catch (IOException e) { e.printStackTrace(); this.server.removeConnexion(this);