From 15bffe2268ae2c1ed30a727cb223f489f1beb850 Mon Sep 17 00:00:00 2001 From: Monimala Mahato <monimalamahato@Monimalas-MacBook-Air.local> Date: Sat, 15 Feb 2025 10:18:38 +0100 Subject: [PATCH] Final Code --- src/.DS_Store | Bin 0 -> 6148 bytes src/chat/Chat.java | 14 ++++ src/chat/ClientInterface.java | 8 +++ src/chat/Message.java | 27 +++++++ src/chat/MessageList.java | 19 +++++ src/client/.DS_Store | Bin 0 -> 6148 bytes src/client/Client.java | 54 ++++++++++++++ src/client/ClientSide.java | 20 ++++++ src/server/.DS_Store | Bin 0 -> 6148 bytes src/server/ChatApp.java | 129 ++++++++++++++++++++++++++++++++++ src/server/Server.java | 33 +++++++++ 11 files changed, 304 insertions(+) create mode 100644 src/.DS_Store create mode 100644 src/chat/Chat.java create mode 100644 src/chat/ClientInterface.java create mode 100644 src/chat/Message.java create mode 100644 src/chat/MessageList.java create mode 100644 src/client/.DS_Store create mode 100644 src/client/Client.java create mode 100644 src/client/ClientSide.java create mode 100644 src/server/.DS_Store create mode 100644 src/server/ChatApp.java create mode 100644 src/server/Server.java diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c0351d348949e30f36702ba1488f9caa9cf045c9 GIT binary patch literal 6148 zcmeHK!AiqG5S?wKrWT<G1&<3}i&{im@e*r2cr~I2m726ggE1>j+8#<FXZ;wjeu=-M zGrOy_jh+ONumdx1c6KIV9?eb{09bR-tpQX3z(yssmeG78v`?Cmf{xH8qi6V|_|XrA zkL%Y=wh0&p3<Lj-0s3|==)fI#kW7ES{$m)#$@caeD-^AT#U*>mF5B1cofx@^mki>j z*T1CInGm7>>3jZp&>OWYt4AVAyddiJWkJyGVanA-5Ou|<DF#tDmbI?huuFESU0ENG zclPR4UaL1IRX*OYHL85KzB`$e?6r-pgVXkX_z;OFMIgiTM#_rDPk2V>tDm9Uk3tdM zVvO<^vCj|!=s^U@Nhmt{tfIs35Owoi3VL(7IpJld{|q-V^3sPP**R`rGTcn%=7yW8 zp60lbKZqO}{SDdW9QI~fG7K07e#Zcv4;+=y(U>ZfM+X{t1wgbgECqcUr&Pl=IvP`j zxP!t}DWWQ6`ij9+ImWrpb2O$3RXH$y`C$6ZOy5wLd^<j$%XDClLSqdBhJjfIifUP* z`G5TL{eQN|tPBH&fm|`btd`qqVoQ3qW}2f}%TaGoNhmK>C`-`jaV#Ag#p|e2aF3IN W=x9t8Vg$wf5s)+(V;J~T20j4q+uphW literal 0 HcmV?d00001 diff --git a/src/chat/Chat.java b/src/chat/Chat.java new file mode 100644 index 0000000..9342928 --- /dev/null +++ b/src/chat/Chat.java @@ -0,0 +1,14 @@ +package chat; + +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.util.List; + +public interface Chat extends Remote { + public void sendMessage(ClientInterface client, String message) throws RemoteException; + public void saveMessageTofile( MessageList message) throws RemoteException; + public void exitChat(ClientInterface client) throws RemoteException; + void registerUsers(ClientInterface client,String username) throws RemoteException; + public void broadcasteMessages(Message message) throws RemoteException; + public MessageList loadHistory() throws RemoteException; +} \ No newline at end of file diff --git a/src/chat/ClientInterface.java b/src/chat/ClientInterface.java new file mode 100644 index 0000000..96f5e02 --- /dev/null +++ b/src/chat/ClientInterface.java @@ -0,0 +1,8 @@ +package chat; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +public interface ClientInterface extends Remote { + public void showMessages(String message) throws RemoteException; // Correct name +} diff --git a/src/chat/Message.java b/src/chat/Message.java new file mode 100644 index 0000000..0952eb7 --- /dev/null +++ b/src/chat/Message.java @@ -0,0 +1,27 @@ +package chat; + +import java.io.Serializable; + +public class Message implements Serializable{ + private static final long serialVersionUID = 1234567L; + String username; + String message; + + public Message(String username, String message){ + this.username=username; + this.message=message; + } + + public String getUsername(String username){ + return username; + } + + public String getMessage(String message){ + return message; + } + + public String toString(){ + return username + ": " + message; + } + +} diff --git a/src/chat/MessageList.java b/src/chat/MessageList.java new file mode 100644 index 0000000..19726c5 --- /dev/null +++ b/src/chat/MessageList.java @@ -0,0 +1,19 @@ +package chat; + +import java.io.Serializable; +import java.util.*; + +public class MessageList implements Serializable{ + private static final long serialVersionUID = 1234569L; + private List<Message> msgList=new ArrayList<>(); + +public List<Message> getMsgList() { + return msgList; +} + +public void setMsgList(List<Message> msgList) { + this.msgList = msgList; +} + + +} diff --git a/src/client/.DS_Store b/src/client/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..480f84bb745f46e77404ae7985030f8e816dd16e GIT binary patch literal 6148 zcmeHK%Sr=55Ukc50y&t22aodw;^POF7{Q$L1Lg_JVnEdM{+!>X)sM)ot_Lq7(hW1! znd$1CDagz;0GT|m&w(+3A)BJ8(_=c^J9QAjheWX)4|u{U?y<m2Polp#q-!7H3N`Mq zL3{m+S-o2=>)nzOD$ktl;?0a6aNJ?djJv@jw%q-Sx%N7I&htv{Su4*`C(oSgSbxu! z8?rB3Y+XrODv%1K0;xbM@Dl}iXR8fIj@hRIsX!|5p@5zbg-x*vY#i<AU}q%&alm0S z`ubQ_P6@068%NI2#HmE5N|YGlbdHyZs{$KGr$eInkofYxcoF+L^A`(;RF2uF0;xb( z0j+&$W4-^c`IqS}@+~C0R3H`juL{UuI-gFsySQ7w>{IXB!gkB1rg4orH2R%K0DtH? fa$=J{U({z@71%gx79BS_F&_dZNOq~fFDUR1hEhBJ literal 0 HcmV?d00001 diff --git a/src/client/Client.java b/src/client/Client.java new file mode 100644 index 0000000..bfc53ba --- /dev/null +++ b/src/client/Client.java @@ -0,0 +1,54 @@ +package client; + +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.util.Scanner; + +import chat.Chat; + +public class Client { + public static void main(String [] args) { + + try { + /*if (args.length < 2) { + System.out.println("Usage: java HelloClient <rmiregistry host> <rmiregistry port>"); + return;}*/ + + //String host = args[0]; + //int port = Integer.parseInt(args[1]); + String host = "localhost"; + int port = 2099; + Registry registry = LocateRegistry.getRegistry(host, port); + Chat chat = (Chat) registry.lookup("ChatService"); + + Scanner scanner = new Scanner(System.in); + System.out.print("Enter your username: "); + String username = scanner.nextLine(); + + ClientSide client = new ClientSide(); + + // Remote method invocation + chat.registerUsers(client, username); + + System.out.println("Welcome to the chat, " + username + "! Type your messages below:"); + + while (true) { + String message = scanner.nextLine(); + + // Exit command + if (message.equalsIgnoreCase("/exit")) { + chat.exitChat(client); // Notify the server about exiting + System.out.println("You have left the chat."); + break; + } + + // Send message to the server + chat.sendMessage(client, message); + } + + } catch (Exception e) { +// System.err.println("Error on client: " + e); + e.printStackTrace(); + } + } +} diff --git a/src/client/ClientSide.java b/src/client/ClientSide.java new file mode 100644 index 0000000..4df1834 --- /dev/null +++ b/src/client/ClientSide.java @@ -0,0 +1,20 @@ +package client; + +import java.rmi.RemoteException; +import java.rmi.server.UnicastRemoteObject; + +import chat.ClientInterface; +import chat.Message; + +public class ClientSide extends UnicastRemoteObject implements ClientInterface { + + protected ClientSide() throws RemoteException { + super(); + } + + @Override + public void showMessages(String message) { + System.out.println(message); + } +} + diff --git a/src/server/.DS_Store b/src/server/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..45b86a0275bde25ff4f06319191e434c9bfdbce8 GIT binary patch literal 6148 zcmeHKF-`+95S)b+L7_-V=@$U$DUJ{d>hJ&(Ktd=|5CZD^Ay0ytT@zizr9%jz-N-u| zd&j;T>1;0mo4(#nfH8m}o6r>Wn7Vt1_G<Dz(R_|$JYs=2EUs2P6aB?5J^KMJ@WAJO zLFf6`x69Rf$x%sj&35wP#t1mvFwXJB-!9%eb5A?G5$3qZGZm8G!Ll>5CLNYmOiKk) zfm9$BNCkdM0iM~i;V3YDDv%1K0viRiKNL1$Q?U*7t%J@>0OEk%Zj5zd7N=BfDz<?f zp;=IgLA6?9SkT#DYF<;Z4GcQ079Unu{wiL~SLgi2(_u|u`cxnl*j7NbFKw*z|B|0f zZ;|gQ=~97I;J+$hgV}sG<=fS>_1k;utSxLeY%=Aw3TTYCE&=?bedNdoW4tJ4UQ@9R U)GX?EIx#N-E=amm;1?A51V}wLg8%>k literal 0 HcmV?d00001 diff --git a/src/server/ChatApp.java b/src/server/ChatApp.java new file mode 100644 index 0000000..bcbe1b8 --- /dev/null +++ b/src/server/ChatApp.java @@ -0,0 +1,129 @@ +package server; + + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.rmi.RemoteException; +import java.util.*; +import java.util.Map.Entry; + +import chat.Chat; +import chat.ClientInterface; +import chat.Message; +import chat.MessageList; + +public class ChatApp implements Chat{ + + Map<ClientInterface, String> activeUsers = new HashMap<>(); + private List <Message> messages=new ArrayList<>(); + @Override + public void registerUsers(ClientInterface client, String username) throws RemoteException { + MessageList history=loadHistory(); + if (activeUsers.containsValue(username)) { + throw new RemoteException("Username already taken! Please choose another one."); + } else { + activeUsers.put(client,username); + if(history!=null){ + for(Message msg: history.getMsgList()){ + try{ + client.showMessages(msg.toString()); + }catch(Exception e){ + e.printStackTrace(); + } + } + } + System.out.println(username + " has joined the chat."); + } + } + + + @Override + public void sendMessage(ClientInterface client, String message) throws RemoteException { + String username = activeUsers.get(client); + + if(username==null) { + System.out.println("Please register first"); + } + + Message msg= new Message(username, message); + messages.add(msg); + saveMessage(msg); + broadcasteMessages(msg); + } + + private void saveMessage(Message msg) throws RemoteException{ + MessageList messageList= loadHistory(); + + if(messageList==null){ + System.out.println("No previous history found \n"); + MessageList messageListNew= new MessageList(); + messageListNew.getMsgList().add(msg); + saveMessageTofile(messageListNew); + + }else{ + messageList.getMsgList().add(msg); + saveMessageTofile(messageList); + + } + } + + @Override + public void exitChat(ClientInterface client) throws RemoteException { + activeUsers.remove(client); + } + + + @Override + public void broadcasteMessages(Message message) throws RemoteException { + for (Entry<ClientInterface, String> entry : activeUsers.entrySet()) { + try { + ClientInterface client = entry.getKey(); + client.showMessages(message.toString()); + }catch (RemoteException e) { + System.out.println("Error sending message to " + entry.getKey() + ": " + e.getMessage()); + } + + } + } + + @Override + public void saveMessageTofile( MessageList message) throws RemoteException { + try (FileOutputStream file= new FileOutputStream("chat_history.ser"); + ObjectOutputStream out= new ObjectOutputStream(file)){ + out.writeObject(message); + // Append message to the file + } catch (IOException e) { + System.out.println("Error saving message: " + e.getMessage()); + } + + } + + @Override +public MessageList loadHistory() throws RemoteException { + MessageList msg=null; + try (FileInputStream file = new FileInputStream("chat_history.ser"); + ObjectInputStream input = new ObjectInputStream(file)) { + + + try { + msg= (MessageList) input.readObject(); + if(msg!=null){ + for(Message message : msg.getMsgList()){ + + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + + } catch (Exception e) { + } + + return msg; +} + +} diff --git a/src/server/Server.java b/src/server/Server.java new file mode 100644 index 0000000..23200fd --- /dev/null +++ b/src/server/Server.java @@ -0,0 +1,33 @@ +package server; + +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; + +import chat.Chat; + +public class Server { + public static void main(String [] args) { + try { + ChatApp ca = new ChatApp(); + Chat h_stub = (Chat) UnicastRemoteObject.exportObject(ca, 0); + + Registry registry; + if (args.length > 0) { + int port = Integer.parseInt(args[1]); + registry = LocateRegistry.createRegistry(port); // Create registry if not already running + System.out.println("RMI Registry started on port " + port); + } else { + registry = LocateRegistry.createRegistry(2099); // Default port + System.out.println("RMI Registry started on port 2099"); + } + + registry.rebind("ChatService", h_stub); + System.out.println("Server ready"); + + } catch (Exception e) { + System.err.println("Error on server :" + e) ; + e.printStackTrace(); + } + } +} -- GitLab