This tutorial is about creating a chat application using java RMI , Socket connection and java swing .This is the first part of this two part tutorial series . First let’s take a look at the functionalities we will be creating in this chat application.
This chat application will have two parts ( client and server ) . The server will be running as rmi server. Whenever a client connects to server , it will first authenticate the client (client can register himself on the server ) After successful authentication , the client will be shown friend’s list , so that he can chat to his friends. Whenever a friend becomes online or offline , the client is notified and friends list changes dynamically .
Server stores user list and friends list in it's internal database. When the client connects to rmi server , it provides it’s ip also which is saved by rmi server. When a client start chat with online friend , the rmi server issues a remote call to start a socket connection to transfer chat messages . So rmi server here does not store or save chat . The chat messages are transferred directly between the clients by using socket connection between them.
In this part of tutorial , we will create a basic gui using java swing.
so these are our model classes :
/** * Application Name :- Let's Chat * * @(#)ClientApplication.java * * * @author abhishek somani * @version 1.00 2008/4/7 * * Providing the Main userInterface or the Login window for the user * to use this application */ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class ClientApplication extends JFrame implements ActionListener ,MouseListener //, MouseMotionListener { // public and private variables of the class private JTextField username; private JPasswordField password; private JLabel user, pass, error, logo, forgotpassword, register; private JButton enterBtn; private URL url; public JPanel Ippanel , Serveranspanel , buttonpannel, registerpanel, forgotpasswordpanel; public JPanel passwordpannel, usrnamepannel, usrfieldpannel, passfieldpannel, btnpannel, errorpannel; WindowUtilities Look; Toolkit kit; Container contentpane; private int screenheight,screenwidth; private Login obj; final Color COLOR_NORMAL = Color.BLUE; final Color COLOR_HOVER = Color.RED; final Color COLOR_ACTIVE = COLOR_NORMAL; final Color COLOR_BG_NORMAL = Color.LIGHT_GRAY; final Color COLOR_BG_ACTIVE = Color.LIGHT_GRAY; Color mouseOutDefault; // main class for just checking the frame without any other connection public static void main(String [] args) { ClientApplication f = new ClientApplication(); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public ClientApplication() { // Look and feel class of window utility Look = new WindowUtilities(); Look.setNativeLookAndFeel(); addWindowListener(new ExitListener()); // getting the Dimension of the Screen from system // in which this application is running kit = Toolkit.getDefaultToolkit(); Dimension screensize = kit.getScreenSize(); screenheight = screensize.height; screenwidth = screensize.width; //setting the frame on the right hand side corner of the screen setSize(screenwidth/4 , (screenheight-50)); setLocation((screenwidth-screenwidth/4) , 0); setResizable(true); setVisible(true); contentpane = getContentPane(); contentpane.setLayout(new GridLayout(3,1)); // setting the font for any text field of frame java.awt.Font font = new java.awt.Font("Dialog",Font.BOLD,14); // creating one of the main panel Ippanel = new JPanel(); Ippanel.setBorder(BorderFactory.createTitledBorder("Login")); Ippanel.setLayout(new GridLayout(6,1)); // creating and adding username label in usernamepanel usrnamepannel = new JPanel(); user = new JLabel("Username: "); user.setFont(font); usrnamepannel.add(user,BorderLayout.CENTER); Ippanel.add(usrnamepannel, BorderLayout.CENTER); // creating and adding username textfield in usrfieldpanel usrfieldpannel = new JPanel(); usrfieldpannel.add(username = new JTextField(20), BorderLayout.CENTER); Ippanel.add(usrfieldpannel, BorderLayout.CENTER); // creating and adding password label in passwordpanel passwordpannel = new JPanel(); pass = new JLabel("Password: "); pass.setFont(font); passwordpannel.add(pass, BorderLayout.CENTER); Ippanel.add(passwordpannel,BorderLayout.CENTER); // creating and adding password textfield in passfieldpanel passfieldpannel = new JPanel(); passfieldpannel.add(password = new JPasswordField(20),BorderLayout.CENTER ); Ippanel.add(passfieldpannel, BorderLayout.CENTER); // error label in case of username and password doesn't match errorpannel = new JPanel(); error = new JLabel("Username and Password doesn't match"); error.setFont(font); error.setVisible(false); error.setForeground(Color.RED); error.setOpaque(true); errorpannel.add(error,BorderLayout.CENTER); Ippanel.add(errorpannel, BorderLayout.CENTER); // creating and adding login button in btnpanel btnpannel = new JPanel(); enterBtn = new JButton("Login"); enterBtn.setFont(font); btnpannel.add(enterBtn, BorderLayout.CENTER); Ippanel.add(btnpannel, BorderLayout.CENTER); // adding logo of the Let's chat to the frame Serveranspanel = new JPanel(); Serveranspanel.setBorder(BorderFactory.createLineBorder (Color.blue, 2)); Serveranspanel.setBackground(Color.CYAN); ImageIcon letchaticon = new ImageIcon("images/llo.jpg"); logo = new JLabel(); logo.setIcon(letchaticon); logo.setToolTipText("Welcome to Let's Chat Application"); Serveranspanel.add(logo); // creating and adding register label registerpanel = new JPanel(); register = new JLabel("Register"); register.setFont(font); register.addMouseListener(this); registerpanel.add(register, BorderLayout.CENTER); // creating and adding forgetpassword label forgotpasswordpanel = new JPanel(); forgotpassword = new JLabel("Forgot Password"); forgotpassword.setFont(font); forgotpassword.addMouseListener(this); forgotpasswordpanel.add(forgotpassword, BorderLayout.CENTER); buttonpannel = new JPanel(); buttonpannel.setLayout(new GridLayout(8,1)); buttonpannel.add(registerpanel,BorderLayout.CENTER); buttonpannel.add(forgotpasswordpanel,BorderLayout.CENTER); // adding all the pannels to ContentPane contentpane.add(Serveranspanel); contentpane.add(Ippanel); contentpane.add(buttonpannel); // add Action listener to the login button enterBtn.addActionListener(this); enterBtn.setToolTipText("Please enter username and password then press this button"); } // action againist login button click public void actionPerformed(ActionEvent ae) { //System.out.println("Action Performed"); boolean flag; if (ae.getActionCommand().equals("Login")) { JButton clickedbutton = (JButton)ae.getSource(); if(clickedbutton == enterBtn) { String us = username.getText(); String ps = password.getText(); // validating either username and password fields are not empty if(us.equals("")) { error.setText("Please enter the username"); error.setVisible(true); } else if(ps.equals("")) { error.setText("Please enter the password"); error.setVisible(true); } else { obj=new Login(); try { //Get an instance of InetAddress for the local computer InetAddress inetAddress = InetAddress.getLocalHost(); //Get a string representation of the ip address String ipAddress = inetAddress.getHostAddress(); //Print the ip address //System.out.println(ipAddress); flag = obj.login(us,ps,ipAddress); if(flag == true) { //System.out.println("Frame Repainted"); dispose(); } if(flag == false) { error.setText("Username and Password doesn't match"); error.setVisible(true); } } catch(Exception e) { System.out.println(e.getMessage()); } } } } } // action against mouse click on register to open the register for // let's chat application and forgetpassword for existing user who // forget their passwords public void mouseClicked(java.awt.event.MouseEvent me) { if(me.getSource() instanceof JLabel) { JLabel clicked = (JLabel)(me.getSource()); setForeground(COLOR_ACTIVE); mouseOutDefault = COLOR_ACTIVE; if(clicked == register) { //System.out.println("Register Clicked"); //you can create a simple web app where user where user can register themselves and give link here String url = "http://resigisetrurl/chat/register.html"; String os = System.getProperty("os.name").toLowerCase(); Runtime rt = Runtime.getRuntime(); try { if (os.indexOf( "win" ) >= 0) { String[] cmd = new String[4]; cmd[0] = "cmd.exe"; cmd[1] = "/C"; cmd[2] = "start"; cmd[3] = url; rt.exec(cmd); } else if (os.indexOf( "mac" ) >= 0) { rt.exec( "open " + url); } else { //prioritized 'guess' of users' preference String[] brwsers = {"epiphany", "firefox", "mozilla"}; StringBuffer cmd = new StringBuffer(); for (int i=0; iHere , we have created Register and forgot password buttons , which will open browser and point to your web app , where you have defined mechanism for registering a user and forgot password mechanism. Other part of code is quite self explanatory where we have created panels and arranged them in proper way . Post your comments and suggestions !!= 0) { String[] cmd = new String[4]; cmd[0] = "cmd.exe"; cmd[1] = "/C"; cmd[2] = "start"; cmd[3] = url; rt.exec(cmd); } else if (os.indexOf( "mac" ) >= 0) { rt.exec( "open " + url); } else { //prioritized 'guess' of users' preference String[] brwsers = {"epiphany", "firefox", "mozilla", "konqueror", "netscape","opera","links","lynx"}; StringBuffer cmd = new StringBuffer(); for (int i=0; i<brwsers.length; i++) cmd.append( (i==0 ? "" : " || " ) + brwsers[i] +" \"" + url + "\" "); rt.exec(new String[] { "sh", "-c", cmd.toString() }); } } catch(Exception e) { System.out.println("error occured in opening browser"); } } } } public void mouseExited(MouseEvent me) { setForeground(mouseOutDefault); setBackground(COLOR_BG_NORMAL); Cursor cursor = getCursor(); setCursor(cursor.getDefaultCursor()); //System.out.println("Mouse Exited"); } public void mouseReleased(MouseEvent me) { //System.out.println("Mouse Released"); } public void mousePressed(MouseEvent me) { mouseOutDefault = COLOR_ACTIVE; //System.out.println("Mousepressed"); } public void mouseEntered(MouseEvent me) { setForeground(Color.RED); setBackground(COLOR_BG_ACTIVE); Cursor cursor = getCursor(); setCursor(cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // System.out.println("Mouse Entered"); } }