From 027ead9fa990d48e332d123f5bc6f3a017217cab Mon Sep 17 00:00:00 2001 From: Mahdi Date: Sun, 28 Jun 2026 10:02:55 +0330 Subject: [PATCH] debug and test --- .../chat/Client/ServerListener.java | 16 +-- .../university/chat/Client/chatClient.java | 17 ++- .../university/chat/Server/ChatServer.java | 10 +- .../university/chat/Server/ClientSession.java | 105 ++++++++++++------ 4 files changed, 99 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/university/chat/Client/ServerListener.java b/src/main/java/com/university/chat/Client/ServerListener.java index 3e2ddd3..c22c2fa 100644 --- a/src/main/java/com/university/chat/Client/ServerListener.java +++ b/src/main/java/com/university/chat/Client/ServerListener.java @@ -19,24 +19,24 @@ public class ServerListener implements Runnable{ try { while (true){ Object objectInput = in.readObject(); - if(objectInput instanceof ChatMessage){ - if(((ChatMessage) objectInput).getType() == MessageType.LOGIN_SUCCESS){ + if(objectInput instanceof ChatMessage msg){ + if(msg.getType() == MessageType.LOGIN_SUCCESS){ System.out.println("Login success"); - } else if (((ChatMessage) objectInput).getType() == MessageType.LOGIN_FAILED) { + } else if (msg.getType() == MessageType.LOGIN_FAILED) { System.out.println("Login Failed"); } - System.out.println(((ChatMessage) objectInput).getSender()+ ": " + - ((ChatMessage) objectInput).getContent()); + System.out.println(msg.getSender()+ ": " + msg.getContent()); } - else if(objectInput instanceof FileMessage){ - System.out.println("File name: " + ((FileMessage) objectInput).getFilename() - + "from : "+ ((FileMessage) objectInput).getSender()+ " recived."); + else if(objectInput instanceof FileMessage filemsg){ + System.out.println("File name: "+ filemsg.getFilename() + +"from : "+ filemsg.getSender()+ " recived."); } } } catch (Exception e){ System.out.println("Disconnected from server"); + System.out.println(e.getMessage()); } } } diff --git a/src/main/java/com/university/chat/Client/chatClient.java b/src/main/java/com/university/chat/Client/chatClient.java index 66732de..c53aeec 100644 --- a/src/main/java/com/university/chat/Client/chatClient.java +++ b/src/main/java/com/university/chat/Client/chatClient.java @@ -26,15 +26,15 @@ public class chatClient { out.flush(); ServerListener serverListener = new ServerListener(in); - Thread t = new Thread(); + Thread t = new Thread(serverListener); t.start(); while (true){ try { - String promt = input.nextLine().trim(); - promt = promt.replace("<", "").replace(">", ""); + String promt = input.nextLine(); + //promt = promt.replace("<", "").replace(">", ""); String[] parts = promt.split(" " , 3); @@ -42,19 +42,24 @@ public class chatClient { case "/msg": { out.writeObject(new ChatMessage(MessageType.PRIVATE_MESSAGE , username - , parts[1] , parts[2])); + , parts[1] ," \'private\' " + parts[2])); break; } case "/users": { out.writeObject(new ChatMessage(MessageType.USER_LIST ,username , "Server" , null)); + out.flush(); break; } case "/sendfile": { - byte[] dataofFile = Files.readAllBytes(Path.of(parts[2])); - out.writeObject(new FileMessage(username , parts[1] , parts[2] , dataofFile )); + File file = new File(String.valueOf(Path.of(parts[2]))); + String filename = file.getName(); + byte[] fileContent = Files.readAllBytes(file.toPath()); + out.writeObject(new FileMessage(username , parts[1] , parts[2] , fileContent )); + out.flush(); + System.out.println("file send."); break; } case "/quit": diff --git a/src/main/java/com/university/chat/Server/ChatServer.java b/src/main/java/com/university/chat/Server/ChatServer.java index 0be86ba..07fa588 100644 --- a/src/main/java/com/university/chat/Server/ChatServer.java +++ b/src/main/java/com/university/chat/Server/ChatServer.java @@ -7,22 +7,26 @@ import java.net.Socket; public class ChatServer { private static final UserManager users = new UserManager(); + private static ServerSocket srvSocket; - - public static void main(String[] args) { + public static void main(String[] args) throws IOException { try { - ServerSocket srvSocket = new ServerSocket(5000); + srvSocket = new ServerSocket(5000); + System.out.println("Servre start."); while (true){ Socket clientsocket = srvSocket.accept(); ClientSession clientSession = new ClientSession(clientsocket , users); Thread t = new Thread(clientSession); t.start(); + } } catch (IOException e) { System.out.println(e.getMessage()); + }finally { + srvSocket.close(); } } } diff --git a/src/main/java/com/university/chat/Server/ClientSession.java b/src/main/java/com/university/chat/Server/ClientSession.java index 38a7d2e..a277e31 100644 --- a/src/main/java/com/university/chat/Server/ClientSession.java +++ b/src/main/java/com/university/chat/Server/ClientSession.java @@ -4,19 +4,23 @@ import com.university.chat.Common.ChatMessage; import com.university.chat.Common.FileMessage; import com.university.chat.Common.MessageType; +import java.io.File; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.nio.file.Files; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; public class ClientSession implements Runnable { private String username; - private ObjectOutputStream out; - private ObjectInputStream in; - private Socket socket; - private UserManager userManage; + private ObjectOutputStream out = null; + private ObjectInputStream in = null; + private final Socket socket; + private final UserManager userManage; + private final Lock L = new ReentrantLock(); @@ -26,24 +30,19 @@ public class ClientSession implements Runnable { try { out = new ObjectOutputStream(socket.getOutputStream()); - out.flush(); in = new ObjectInputStream(socket.getInputStream()); } catch (IOException e) { - throw new RuntimeException(e); + System.out.println(e.getMessage()); } - - // TODO : Create an ObjectOutputStream from socket.getOutputStream() - // and an ObjectInputStream from socket.getInputStream(). } @Override public void run() { try { - ChatMessage loginmsg = (ChatMessage) in.readObject(); - String username = loginmsg.getSender(); + username = loginmsg.getSender(); if(loginmsg.getType() != MessageType.LOGIN){ @@ -53,32 +52,39 @@ public class ClientSession implements Runnable { return; } + FileManager.createUserFolders(username); + out.writeObject(new ChatMessage(MessageType.LOGIN_SUCCESS , "server" , - null , "welcome to messanger")); + username , "welcome to messanger login succes")); + System.out.println(username + " connected"); userManage.addUser(username , this); + while (true){ + Object inputobj = in.readObject(); + if(inputobj == null){ + continue; + } + if(inputobj instanceof ChatMessage msg){ + handleChatMessage(msg); + } else if (inputobj instanceof FileMessage filemsg) { + handleFileMessage(filemsg); + } + } - // 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. - - // 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). } catch (Exception e) { System.out.println("Disconnected: " + username); + System.out.println(e.getMessage()); } finally { - // TODO: Remove the user from UserManager so they no longer - // receive broadcasts or appear in users list + if(username != null) { + userManage.removeUser(username); + } + try { + socket.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } } } @@ -86,13 +92,26 @@ public class ClientSession implements Runnable { private void handleChatMessage(ChatMessage msg) throws IOException { switch (msg.getType()) { case PUBLIC_MESSAGE -> { - // TODO: Broadcast this message to every connected client. + for(ClientSession cs : userManage.getAllSessions()){ + if(cs != this){ + cs.sendMessage(msg); + } + } } case PRIVATE_MESSAGE -> { - // TODO: Forward this message to the receiver user. + ClientSession cs = userManage.getUser(msg.getReceiver()); + if (cs != null) { + cs.sendMessage(msg); + } } case USER_LIST -> { - // TODO: Reply to the requester with the list of online users. + ClientSession cs = userManage.getUser(msg.getSender()); + ChatMessage listReply = new ChatMessage(MessageType.USER_LIST, "server", + username, userManage.listUsers()); + + if (cs != null) { + cs.sendMessage(listReply); + } } } } @@ -105,6 +124,28 @@ public class ClientSession implements Runnable { Files.write(sentPath, fileMsg.getData()); Files.write(recvPath, fileMsg.getData()); - // TODO: Forward the received file-message to the destination user. + ClientSession cs = userManage.getUser(fileMsg.getReceiver()); + if(cs != null){ + cs.sendMessage(fileMsg); + } + System.out.println("Server received file: " + fileMsg.getFilename() + " with size: " + fileMsg.getData().length); + } + + + + public void sendMessage(Object object) { + try { + L.lock(); + out.writeObject(object); + out.flush(); + } + catch (IOException e) { + System.out.println(e.getMessage()); + } + finally { + L.unlock(); + } + } + } \ No newline at end of file