From a2c43191821cf7478078ed6d9852f50a1d580aa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Sat, 1 Mar 2025 14:52:05 +0100 Subject: [PATCH] handshaking --- ChatApp/src/client/ClientConnexion.java | 37 ++++++++++- ChatApp/src/client/ClientConsole.java | 63 +++++++++++++++---- ChatApp/src/client/ClientListener.java | 2 + .../src/network/protocol/PacketVisitor.java | 2 + .../protocol/packets/HandshakePacket.java | 14 +++++ ChatApp/src/server/ServerConnexion.java | 7 +++ 6 files changed, 110 insertions(+), 15 deletions(-) create mode 100644 ChatApp/src/network/protocol/packets/HandshakePacket.java diff --git a/ChatApp/src/client/ClientConnexion.java b/ChatApp/src/client/ClientConnexion.java index edce535..1024d86 100644 --- a/ChatApp/src/client/ClientConnexion.java +++ b/ChatApp/src/client/ClientConnexion.java @@ -12,6 +12,7 @@ import network.protocol.PacketVisitor; import network.protocol.packets.ChatMessagePacket; import network.protocol.packets.CreateRoomPacket; import network.protocol.packets.DisconnectPacket; +import network.protocol.packets.HandshakePacket; import network.protocol.packets.JoinRoomPacket; import network.protocol.packets.LeaveRoomPacket; import network.protocol.packets.LoginPacket; @@ -20,18 +21,40 @@ import network.protocol.packets.RoomListPacket; import network.protocol.packets.SendChatMessagePacket; import network.protocol.packets.ServerResponsePacket; -public class ClientConnexion implements PacketVisitor, PacketHandler{ +public class ClientConnexion implements PacketVisitor, PacketHandler { private final InetSocketAddress serverAddress; private final SocketWriter writer; private final SocketReader reader; private final ClientListener callback; + private volatile boolean connected = false; public ClientConnexion(DatagramSocket socket, InetSocketAddress serverAddress, ClientListener callback) { this.serverAddress = serverAddress; this.writer = new SocketWriter(socket); this.reader = new SocketReader(socket, this); this.callback = callback; + spamHandshake(); + } + + private void spamHandshake() { + for (int i = 0; i < 5; i++) { + sendPacket(new HandshakePacket()); + } + new Thread(() -> waitForHandshake()).start(); + } + + private void waitForHandshake() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(!connected) { + System.out.println("The server did not respond !"); + this.close(); + this.callback.handleConnexionError(); + } } public void close() { @@ -43,7 +66,7 @@ public class ClientConnexion implements PacketVisitor, PacketHandler{ this.writer.sendPacket(packet, serverAddress); } catch (IOException e) { this.close(); - this.callback.handleDisconnect(); + this.callback.handleConnexionError(); e.printStackTrace(); } } @@ -72,9 +95,17 @@ public class ClientConnexion implements PacketVisitor, PacketHandler{ @Override public void visitPacket(DisconnectPacket packet) { this.close(); + this.connected = false; this.callback.handleDisconnect(); } + @Override + public void visitPacket(HandshakePacket packet) { + if (!connected) + this.callback.handleConnect(); + this.connected = true; + } + @Override public void visitPacket(CreateRoomPacket packet) { throw new UnsupportedOperationException("Unimplemented method 'visitPacket'"); @@ -104,5 +135,5 @@ public class ClientConnexion implements PacketVisitor, PacketHandler{ public void visitPacket(SendChatMessagePacket packet) { throw new UnsupportedOperationException("Unimplemented method 'visitPacket'"); } - + } diff --git a/ChatApp/src/client/ClientConsole.java b/ChatApp/src/client/ClientConsole.java index b23c3a7..c463a70 100644 --- a/ChatApp/src/client/ClientConsole.java +++ b/ChatApp/src/client/ClientConsole.java @@ -15,9 +15,16 @@ public class ClientConsole implements ClientListener { private Client client; private final Thread inputThread; private final Scanner scanner; + private volatile boolean connected = false; public static void main(String[] args) { - new ClientConsole(new InetSocketAddress("localhost", 6665)); + ClientConsole console = new ClientConsole(new InetSocketAddress("localhost", 6665)); + try { + console.joinThread(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("End !"); } public ClientConsole(InetSocketAddress address) { @@ -34,7 +41,8 @@ public class ClientConsole implements ClientListener { private String inputPseudo() { System.out.println("Enter your pseudo:"); - String pseudo = this.scanner.nextLine(); + String pseudo = "chatter"; + pseudo = this.scanner.nextLine(); return pseudo; } @@ -43,11 +51,24 @@ public class ClientConsole implements ClientListener { } private void inputLoop() { + //waiting to be connected + try { + Thread.sleep(2000); + return; + } catch (InterruptedException e) { + if (!connected) + return; + } + + // resets the interrupt + Thread.interrupted(); + while (!Thread.interrupted()) { - String message = scanner.nextLine(); + String message = this.scanner.nextLine(); + if (Thread.interrupted()) + break; visitMessage(message); } - this.scanner.close(); } public void joinThread() throws InterruptedException { @@ -88,23 +109,34 @@ public class ClientConsole implements ClientListener { } } + private void stop() { + this.inputThread.interrupt(); + } + @Override public void handleDisconnect() { System.out.println("Disconnected !"); - this.inputThread.interrupt(); + stop(); + } + + @Override + public void handleConnexionError() { + System.out.println("An error occured during the connexion !"); + this.connected = false; + stop(); } @Override public void handleChatMessage(Instant time, String chatter, String content) { StringBuilder sb = new StringBuilder(); String strTime = time.toString(); - sb.append("&y["); - sb.append(strTime, 11, 19); // We only take the HH:MM:SS part - sb.append("]&n"); - sb.append(" "); - sb.append(chatter); - sb.append(" : "); - sb.append(content).append("&n"); // make the color back to normal at the end of every message + sb.append("&y[") + .append(strTime, 11, 19) // We only take the HH:MM:SS part + .append("]&n") + .append(" ") + .append(chatter) + .append(" : ") + .append(content).append("&n"); // make the color back to normal at the end of every message System.out.println(ANSIColor.formatString(sb.toString())); } @@ -125,4 +157,11 @@ public class ClientConsole implements ClientListener { System.out.println(response); } + @Override + public void handleConnect() { + System.out.println("Connected to server !"); + this.connected = true; + this.inputThread.interrupt(); + } + } diff --git a/ChatApp/src/client/ClientListener.java b/ChatApp/src/client/ClientListener.java index 7fcf584..04d9f24 100644 --- a/ChatApp/src/client/ClientListener.java +++ b/ChatApp/src/client/ClientListener.java @@ -8,6 +8,8 @@ import network.protocol.packets.ServerResponsePacket; public interface ClientListener { void handleDisconnect(); + void handleConnexionError(); + void handleConnect(); void handleChatMessage(Instant time, String chatter, String content); void handleRoomList(List roomNames); void handleServerResponse(ServerResponsePacket.Response response); diff --git a/ChatApp/src/network/protocol/PacketVisitor.java b/ChatApp/src/network/protocol/PacketVisitor.java index 4e69003..66edc28 100644 --- a/ChatApp/src/network/protocol/PacketVisitor.java +++ b/ChatApp/src/network/protocol/PacketVisitor.java @@ -3,6 +3,7 @@ package network.protocol; import network.protocol.packets.ChatMessagePacket; import network.protocol.packets.CreateRoomPacket; import network.protocol.packets.DisconnectPacket; +import network.protocol.packets.HandshakePacket; import network.protocol.packets.JoinRoomPacket; import network.protocol.packets.LeaveRoomPacket; import network.protocol.packets.LoginPacket; @@ -20,6 +21,7 @@ public interface PacketVisitor { void visitPacket(ChatMessagePacket packet); void visitPacket(CreateRoomPacket packet); void visitPacket(DisconnectPacket packet); + void visitPacket(HandshakePacket packet); void visitPacket(JoinRoomPacket packet); void visitPacket(LeaveRoomPacket packet); void visitPacket(LoginPacket packet); diff --git a/ChatApp/src/network/protocol/packets/HandshakePacket.java b/ChatApp/src/network/protocol/packets/HandshakePacket.java new file mode 100644 index 0000000..85f49c8 --- /dev/null +++ b/ChatApp/src/network/protocol/packets/HandshakePacket.java @@ -0,0 +1,14 @@ +package network.protocol.packets; + +import network.protocol.Packet; +import network.protocol.PacketVisitor; + +public class HandshakePacket extends Packet { + public HandshakePacket() { + } + + @Override + public void accept(PacketVisitor packetVisitor) { + packetVisitor.visitPacket(this); + } +} \ No newline at end of file diff --git a/ChatApp/src/server/ServerConnexion.java b/ChatApp/src/server/ServerConnexion.java index 331d41a..7889453 100644 --- a/ChatApp/src/server/ServerConnexion.java +++ b/ChatApp/src/server/ServerConnexion.java @@ -11,6 +11,7 @@ import network.protocol.PacketVisitor; import network.protocol.packets.ChatMessagePacket; import network.protocol.packets.CreateRoomPacket; import network.protocol.packets.DisconnectPacket; +import network.protocol.packets.HandshakePacket; import network.protocol.packets.JoinRoomPacket; import network.protocol.packets.LeaveRoomPacket; import network.protocol.packets.LoginPacket; @@ -99,6 +100,12 @@ public class ServerConnexion implements PacketVisitor { this.onDisconnect(); } + @Override + public void visitPacket(HandshakePacket packet) { + System.out.println("[Server] Handshake received from " + clientAddress); + sendPacket(packet); + } + private void onDisconnect() { if (this.server.isInRoom(this)) { this.onRoomLeave(this.server.getRoomName(this));