diff --git a/bin/javaChat/ChatClient$1.class b/bin/javaChat/ChatClient$1.class new file mode 100644 index 0000000..48518d4 Binary files /dev/null and b/bin/javaChat/ChatClient$1.class differ diff --git a/bin/javaChat/ChatClient$2.class b/bin/javaChat/ChatClient$2.class new file mode 100644 index 0000000..b29261b Binary files /dev/null and b/bin/javaChat/ChatClient$2.class differ diff --git a/bin/javaChat/ChatClient.class b/bin/javaChat/ChatClient.class new file mode 100644 index 0000000..67ca78e Binary files /dev/null and b/bin/javaChat/ChatClient.class differ diff --git a/bin/javaChat/ChatServer.class b/bin/javaChat/ChatServer.class new file mode 100644 index 0000000..21c4d11 Binary files /dev/null and b/bin/javaChat/ChatServer.class differ diff --git a/bin/javaChat/ClientHandler.class b/bin/javaChat/ClientHandler.class new file mode 100644 index 0000000..b606840 Binary files /dev/null and b/bin/javaChat/ClientHandler.class differ diff --git a/bin/module-info.class b/bin/module-info.class index 7155e5e..5ca383f 100644 Binary files a/bin/module-info.class and b/bin/module-info.class differ diff --git a/src/javaChat/ChatClient.java b/src/javaChat/ChatClient.java new file mode 100644 index 0000000..a342832 --- /dev/null +++ b/src/javaChat/ChatClient.java @@ -0,0 +1,90 @@ +package javaChat; + +import java.net.* ; +import java.io.* ; + +public class ChatClient + { + + /** + * + * + * @param args + * @throws IOException + */ + public static void main( String[] args ) throws IOException + { + // Get server IP + BufferedReader keyboard = new BufferedReader( new InputStreamReader( System.in ) ) ; + System.out.print( "\nPlease enter the IP of the desired server: " ); // GUI: IP BOX + + String serverIP = keyboard.readLine() ; + + // Open your connection to a server, at port 6789 + Socket socket = new Socket( serverIP , 6789 ) ; + + // Create communication streams + DataInputStream dataStreamIn = new DataInputStream( socket.getInputStream() ) ; + DataOutputStream dataStreamOut = new DataOutputStream( socket.getOutputStream() ) ; + + // Establish connection, make user-name + System.out.print( "\nConnection established,\nPlease enter a username: " ) ; + String username = keyboard.readLine() ; + dataStreamOut.writeUTF( username ) ; + + ///////////////////////// + //// Program Running //// + ///////////////////////// + + // Thread for sending messages + Thread sendMessage = new Thread(new Runnable() + { + @Override + public void run() + { + System.out.print( "\n-= Type /help for a list of commands =-" ) ; + while( true ) + { + try + { + String messageOut = keyboard.readLine() ; + dataStreamOut.writeUTF( messageOut ) ; + } + catch( IOException x ) + { + x.printStackTrace() ; + System.exit( 0 ) ; + } + } + } + }) ; + + // Thread for receiving messages + Thread receiveMessage = new Thread( new Runnable() + { + + @Override + public void run() + { + while( true ) + { + try + { + String messageIn = dataStreamIn.readUTF() ; + System.out.printf( "%n%s\n", messageIn ) ; + } + catch( IOException x ) + { + x.printStackTrace() ; + System.exit( 0 ) ; + } + } + } + }); + + // Begin threads + sendMessage.start() ; + receiveMessage.start() ; + } + } + // end class ChatClient \ No newline at end of file diff --git a/src/javaChat/ChatServer.java b/src/javaChat/ChatServer.java new file mode 100644 index 0000000..22c5575 --- /dev/null +++ b/src/javaChat/ChatServer.java @@ -0,0 +1,237 @@ +package javaChat; + +import java.net.* ; +import java.util.* ; +import java.io.* ; + +public class ChatServer + { + + // List of all active users in Server + static ArrayList userList = new ArrayList<>() ; + + /** + * Accepts Client requests to join chat server, and + * creates new thread for each individual client. + * + * @param args + * @throws IOException + */ + public static void main( String[] args ) throws IOException + { + + // Register service on port 6789 + ServerSocket serverSocket = new ServerSocket( 6789 ) ; + Socket socket = null ; + + System.out.println( "\nServer established. Awaiting connections..." ) ; + + // Accept client requests + while( true ) + { + socket = serverSocket.accept() ; + + DataOutputStream dataStreamOut = new DataOutputStream( socket.getOutputStream() ) ; + DataInputStream dataStreamIn = new DataInputStream ( socket.getInputStream() ) ; + + System.out.println( "\nClient connection detected, requesting username..." ) ; + String username = dataStreamIn.readUTF() ; + + ClientHandler handle = new ClientHandler( socket, username, dataStreamOut, dataStreamIn ) ; + + System.out.println( "\nCreating new thread...\n" ) ; + Thread thread = new Thread( handle ) ; + + userList.add( handle ) ; + + thread.start() ; + + } + } + + } + // end class ChatClient + + + + + // This class manages the actual messages being sent around + @SuppressWarnings( "javadoc" ) + class ClientHandler implements Runnable + { + + Socket socket ; + String username ; + final DataOutputStream dataStreamOut ; + final DataInputStream dataStreamIn ; + boolean loggedIn ; + private ArrayList userList ; + + + /** + * Constructor + * @param s : client socket + * @param user : client's user-name + * @param dos : data stream to client + * @param dis : data stream from client + */ + public ClientHandler( Socket s, String user, + DataOutputStream dos, + DataInputStream dis ) + { + this.username = user ; + this.socket = s ; + this.dataStreamOut = dos ; + this.dataStreamIn = dis ; + this.loggedIn = true ; + + } + + @Override + public void run() + { + + // Note the connection of the new user + String announcement = String.format( "-= User \"%s\" has successfully connected =-\n", this.username ) ; + System.out.println( announcement ) ; + + // Distribute announcement to entire server + distributeAll( announcement ) ; + + // Message management + String message = "" ; + while( true ) + { + // Read incoming messages + try + { + message = this.dataStreamIn.readUTF() ; + } + catch ( IOException x ) + { + x.printStackTrace() ; + } + + // Check message for user commands, returns TRUE is user quits + if( commands(message, this) ) + { + break ; + } + + // Print the message server-side + message = String.format( "%s: %s", this.username, message ) ; + System.out.println( message ) ; + + // Distribute the message to all users + sendMessage( message ) ; + // end try + + } + + try + { + this.loggedIn = false ; + this.socket.close() ; + } + catch( IOException x ) + { + x.printStackTrace() ; + } + } + + + // This method manages the usage of user-commands + public boolean commands(String message, ClientHandler user) + { + String[] commands = new String[] {"/help", "/quit", "/userlist"} ; + + try { + + // Quit command terminates connection, with an announcement + if( message.equals( "/quit" )) + { + String announcement = String.format( "\n-= \"%s\" has disconnected =- \n", user.username ) ; + System.out.println( announcement ) ; + distributeAll( announcement ) ; + return true ; + } + + if( message.equals( "/userlist" ) ) + { + user.dataStreamOut.writeUTF( "Current list of users in the server: " ) ; + for( ClientHandler users : ChatServer.userList ) + { + if( !users.loggedIn ) + { + continue ; + } + + user.dataStreamOut.writeUTF( users.username ) ; + + } + } + + if( message.contentEquals( "/help" ) ) + { + user.dataStreamOut.writeUTF( "\nAll available commands: " ); + for(int i = 0; i < commands.length; i++ ) + { + user.dataStreamOut.writeUTF( commands[i] ); + } + + user.dataStreamOut.writeUTF( "\n" ) ; + } + } + + catch( IOException x ) + { + System.out.println( x ) ; + } + + return false ; + } + + + // Convenience method to send messages (but not to the user that's sending the message) + private void sendMessage(String message) + { + try + { + for( ClientHandler users : ChatServer.userList ) + { + if( !users.loggedIn || users.equals( this ) ) + { + continue ; + } + users.dataStreamOut.writeUTF( "> " + message ) ; + } + } + catch ( IOException x ) + { + x.printStackTrace() ; + } + } + + + // Convenience method to distribute messages to all clients (announcements) + private void distributeAll(String message) + { + try + { + for( ClientHandler users : ChatServer.userList ) + { + if( !users.loggedIn ) + { + continue ; + } + users.dataStreamOut.writeUTF( message ) ; + } + } + catch ( IOException x ) + { + x.printStackTrace() ; + } + } + + } + // end class ClientHandler \ No newline at end of file diff --git a/src/module-info.java b/src/module-info.java index 4833feb..2d8c047 100644 --- a/src/module-info.java +++ b/src/module-info.java @@ -6,4 +6,5 @@ * */ module javaChat - {} \ No newline at end of file + { + requires java.desktop;} \ No newline at end of file