handshaking

This commit is contained in:
Clément
2025-03-01 14:52:05 +01:00
committed by Persson-dev
parent 90f92281ef
commit a2c4319182
6 changed files with 110 additions and 15 deletions

View File

@@ -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'");
}
}

View File

@@ -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();
}
}

View File

@@ -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<String> roomNames);
void handleServerResponse(ServerResponsePacket.Response response);

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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));