diff options
| -rw-r--r-- | bin/javaChat/ChatClient$1.class | bin | 0 -> 1293 bytes | |||
| -rw-r--r-- | bin/javaChat/ChatClient$2.class | bin | 0 -> 1147 bytes | |||
| -rw-r--r-- | bin/javaChat/ChatClient.class | bin | 0 -> 2023 bytes | |||
| -rw-r--r-- | bin/javaChat/ChatServer.class | bin | 0 -> 2122 bytes | |||
| -rw-r--r-- | bin/javaChat/ClientHandler.class | bin | 0 -> 3773 bytes | |||
| -rw-r--r-- | bin/module-info.class | bin | 147 -> 171 bytes | |||
| -rw-r--r-- | src/javaChat/ChatClient.java | 90 | ||||
| -rw-r--r-- | src/javaChat/ChatServer.java | 237 | ||||
| -rw-r--r-- | src/module-info.java | 3 |
9 files changed, 329 insertions, 1 deletions
diff --git a/bin/javaChat/ChatClient$1.class b/bin/javaChat/ChatClient$1.class Binary files differnew file mode 100644 index 0000000..48518d4 --- /dev/null +++ b/bin/javaChat/ChatClient$1.class diff --git a/bin/javaChat/ChatClient$2.class b/bin/javaChat/ChatClient$2.class Binary files differnew file mode 100644 index 0000000..b29261b --- /dev/null +++ b/bin/javaChat/ChatClient$2.class diff --git a/bin/javaChat/ChatClient.class b/bin/javaChat/ChatClient.class Binary files differnew file mode 100644 index 0000000..67ca78e --- /dev/null +++ b/bin/javaChat/ChatClient.class diff --git a/bin/javaChat/ChatServer.class b/bin/javaChat/ChatServer.class Binary files differnew file mode 100644 index 0000000..21c4d11 --- /dev/null +++ b/bin/javaChat/ChatServer.class diff --git a/bin/javaChat/ClientHandler.class b/bin/javaChat/ClientHandler.class Binary files differnew file mode 100644 index 0000000..b606840 --- /dev/null +++ b/bin/javaChat/ClientHandler.class diff --git a/bin/module-info.class b/bin/module-info.class Binary files differindex 7155e5e..5ca383f 100644 --- a/bin/module-info.class +++ b/bin/module-info.class 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<ClientHandler> 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<ClientHandler> 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 |
