diff --git a/pom.xml b/pom.xml
index c7c56af..44a42fa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,8 +9,8 @@
1.0-SNAPSHOT
- 25
- 25
+ 21
+ 21
UTF-8
diff --git a/src/main/java/com/university/chat/Server/ClientSession.java b/src/main/java/com/university/chat/Server/ClientSession.java
index 864fb87..f0c79a4 100644
--- a/src/main/java/com/university/chat/Server/ClientSession.java
+++ b/src/main/java/com/university/chat/Server/ClientSession.java
@@ -2,18 +2,33 @@ package com.university.chat.Server;
import com.university.chat.Common.ChatMessage;
import com.university.chat.Common.FileMessage;
+import com.university.chat.Common.MessageType;
import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.net.Socket;
import java.nio.file.Files;
public class ClientSession implements Runnable {
private String username;
+ private Socket socket;
+ private UserManager userManager;
+ private ObjectOutputStream out;
+ private ObjectInputStream in;
public ClientSession(Socket socket, UserManager userManager) {
- // TODO : Create an ObjectOutputStream from socket.getOutputStream()
- // and an ObjectInputStream from socket.getInputStream().
+
+ this.socket = socket;
+ this.userManager = userManager;
+ try {
+ this.out = new ObjectOutputStream(socket.getOutputStream());
+ this.in = new ObjectInputStream(socket.getInputStream());
+ }
+ catch (IOException e) {
+ System.out.println("Failed to create streams: " + e.getMessage());
+ }
}
@@ -21,28 +36,49 @@ public class ClientSession implements Runnable {
public void run() {
try {
- // TODO: Welcome the user (login step)
- // 1. Read the first object sent by the client.
- // 2. Check it's a ChatMessage with type LOGIN.
- // 3. Extract the username.
- // 4. Try to register the user via userManager.addUser(...).
- // 5. If the username is taken, send back LOGIN_FAILED and close the socket.
- // 6. Otherwise, create the user's folders with FileManager.createUserFolders(...)
- // and send back LOGIN_SUCCESS.
+ Object firstObject = in.readObject();
+ if (!(firstObject instanceof ChatMessage loginMsg) || loginMsg.getType() != MessageType.LOGIN) {
+ socket.close();
+ return;
+ }
+ username = loginMsg.getSender();
- // TODO: Main message loop
- // In a loop, call in.readObject(), you can separate messages by their type:
- // - if it's a ChatMessage -> call handleChatMessage(msg)
- // - if it's a FileMessage -> call handleFileMessage(fileMsg)
- // Keep looping until the connection is closed (an exception will be thrown).
+ boolean registered = userManager.addUser(username,this);
+
+ if (!registered) {
+ sendMessage(new ChatMessage(MessageType.LOGIN_FAILED, "Server", username, "Username already taken."));
+ socket.close();
+ return;
+ }
+ FileManager.createUserFolders(username);
+ sendMessage(new ChatMessage(MessageType.LOGIN_SUCCESS, "Server", username, "Welcome " + username + "!"));
+ System.out.println(username + " logged in successfully.");
+
+ while(true) {
+ Object message = in.readObject();
+ if (message instanceof FileMessage msg) {
+ handleFileMessage(msg);
+ }
+ else if (message instanceof ChatMessage msg) {
+ handleChatMessage(msg);
+ }
+ }
} catch (Exception e) {
System.out.println("Disconnected: " + username);
} finally {
- // TODO: Remove the user from UserManager so they no longer
- // receive broadcasts or appear in users list
+ if (username != null) {
+ userManager.removeUser(username);
+ }
+ try {
+ socket.close();
+ }catch (IOException e) {}
}
}
+ public synchronized void sendMessage(Object obj) throws IOException {
+ out.writeObject(obj);
+ out.flush();
+ }
private void handleChatMessage(ChatMessage msg) throws IOException {