Java Chat Application or Java Messenger

Java Chat Messenger  with Source Code 



If you want chat application in java you are at right place just reefer following java code to do your own java ChatApp.
No worry about java packages, code construction and all just copy and paste the following code and enjoy java Messenger (Chat App).

Requirements 
  • Eclipse (Any version )
  • Java Jdk 6 n above 
  • Operating system (Any Windows Mac or Linux) 

  Steps1:  Make following java class
  1. ChatMessage
  2. Client
  3. ClientGUI 
  4. Server
  5. ServerGUI
Make sure all class should be in (Ex: Name.java) 
Steps2: import following java class in your java IDE's.

************************************************************************************************
ChatMessage.java


import java.io.*;

public class ChatMessage implements Serializable {

    protected static final long serialVersionUID = 1112122200L;

    static final int WHOISIN = 0, MESSAGE = 1, LOGOUT = 2;

    private int type;

    private String message;

  
    ChatMessage(int type, String message) {

        this.type = type;

        this.message = message;

    }

    int getType() {

        return type;

    }

    String getMessage() {

        return message;

    }

}
************************************************************************************************
Client.java




import java.net.*;
import java.io.*;
import java.util.*;


public class Client  {

private ObjectInputStream sInput;
private ObjectOutputStream sOutput;
private Socket socket;

private ClientGUI cg;

private String server, username;
private int port;

Client(String server, int port, String username) {
this(server, port, username, null);
}

Client(String server, int port, String username, ClientGUI cg) {
this.server = server;
this.port = port;
this.username = username;
this.cg = cg;
}
public boolean start() {
try {
socket = new Socket(server, port);
catch(Exception ec) {
display("Error connectiong to server:" + ec);
return false;
}
String msg = "Connection accepted " + socket.getInetAddress() + ":" + socket.getPort();
display(msg);
try
{
sInput  = new ObjectInputStream(socket.getInputStream());
sOutput = new ObjectOutputStream(socket.getOutputStream());
}
catch (IOException eIO) {
display("Exception creating new Input/output Streams: " + eIO);
return false;
}

new ListenFromServer().start();
try
{
sOutput.writeObject(username);
}
catch (IOException eIO) {
display("Exception doing login : " + eIO);
disconnect();
return false;
}
return true;
}

private void display(String msg) {
if(cg == null)
System.out.println(msg);     
else
cg.append(msg + "\n");
}
void sendMessage(ChatMessage msg) {
try {
sOutput.writeObject(msg);
}
catch(IOException e) {
display("Exception writing to server: " + e);
}
}

private void disconnect() {
try { 
if(sInput != null) sInput.close();
}
catch(Exception e) {} // not much else I can do
try {
if(sOutput != null) sOutput.close();
}
catch(Exception e) {} // not much else I can do
        try{
if(socket != null) socket.close();
}
catch(Exception e) {} // not much else I can do
// inform the GUI
if(cg != null)
cg.connectionFailed();
}
public static void main(String[] args) {
// default values
int portNumber = 1500;
String serverAddress = "localhost";
String userName = "Anonymous";

switch(args.length) {
case 3:
serverAddress = args[2];
case 2:
try {
portNumber = Integer.parseInt(args[1]);
}
catch(Exception e) {
System.out.println("Invalid port number.");
System.out.println("Usage is: > java Client [username] [portNumber] [serverAddress]");
return;
}
case 1: 
userName = args[0];
case 0:
break;
default:
System.out.println("Usage is: > java Client [username] [portNumber] {serverAddress]");
return;
}
Client client = new Client(serverAddress, portNumber, userName);
if(!client.start())
return;
Scanner scan = new Scanner(System.in);
while(true) {
System.out.print("> ");
// read message from user
String msg = scan.nextLine();
// logout if message is LOGOUT
if(msg.equalsIgnoreCase("LOGOUT")) {
client.sendMessage(new ChatMessage(ChatMessage.LOGOUT, ""));
// break to do the disconnect
break;
}
// message WhoIsIn
else if(msg.equalsIgnoreCase("WHOISIN")) {
client.sendMessage(new ChatMessage(ChatMessage.WHOISIN, ""));
}
else { // default to ordinary message
client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, msg));
}
}
client.disconnect();
}

class ListenFromServer extends Thread {

public void run() {
while(true) {
try {
String msg = (String) sInput.readObject();
if(cg == null) {
System.out.println(msg);
System.out.print("> ");
}
else {
cg.append(msg);
}
}
catch(IOException e) {
display("Server has close the connection: " + e);
if(cg != null) 
cg.connectionFailed();
break;
}
catch(ClassNotFoundException e2) {
}
}
}
}
}
************************************************************************************************
ClientGUI.java


    1. import javax.swing.*;
      import java.awt.*;
      import java.awt.event.*;
      public class ClientGUI extends JFrame implements ActionListener {

      private static final long serialVersionUID = 1L;
      private JLabel label;
      private JTextField tf;
      private JTextField tfServer, tfPort;
      private JButton login, logout, whoIsIn;
      private JTextArea ta;
      private boolean connected;
      private Client client;
      private int defaultPort;
      private String defaultHost;
      ClientGUI(String host, int port) {

      super("Chat Client");
      defaultPort = port;
      defaultHost = host;
      JPanel northPanel = new JPanel(new GridLayout(3,1));
      JPanel serverAndPort = new JPanel(new GridLayout(1,5, 1, 3));
      tfServer = new JTextField(host);
      tfPort = new JTextField("" + port);
      tfPort.setHorizontalAlignment(SwingConstants.RIGHT);

      serverAndPort.add(new JLabel("Server Address:  "));
      serverAndPort.add(tfServer);
      serverAndPort.add(new JLabel("Port Number:  "));
      serverAndPort.add(tfPort);
      serverAndPort.add(new JLabel(""));
      // adds the Server an port field to the GUI
      northPanel.add(serverAndPort);

      // the Label and the TextField
      label = new JLabel("Enter your username below", SwingConstants.CENTER);
      northPanel.add(label);
      tf = new JTextField("Anonymous");
      tf.setBackground(Color.WHITE);
      northPanel.add(tf);
      add(northPanel, BorderLayout.NORTH);

      // The CenterPanel which is the chat room
      ta = new JTextArea("Welcome to the Chat room\n", 80, 80);
      JPanel centerPanel = new JPanel(new GridLayout(1,1));
      centerPanel.add(new JScrollPane(ta));
      ta.setEditable(false);
      add(centerPanel, BorderLayout.CENTER);

      // the 3 buttons
      login = new JButton("Login");
      login.addActionListener(this);
      logout = new JButton("Logout");
      logout.addActionListener(this);
      logout.setEnabled(false); // you have to login before being able to logout
      whoIsIn = new JButton("Who is in");
      whoIsIn.addActionListener(this);
      whoIsIn.setEnabled(false); // you have to login before being able to Who is in

      JPanel southPanel = new JPanel();
      southPanel.add(login);
      southPanel.add(logout);
      southPanel.add(whoIsIn);
      add(southPanel, BorderLayout.SOUTH);

      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setSize(600, 600);
      setVisible(true);
      tf.requestFocus();

      }

      void append(String str) {
      ta.append(str);
      ta.setCaretPosition(ta.getText().length() - 1);
      }
      void connectionFailed() {
      login.setEnabled(true);
      logout.setEnabled(false);
      whoIsIn.setEnabled(false);
      label.setText("Enter your username below");
      tf.setText("Anonymous");
      tfPort.setText("" + defaultPort);
      tfServer.setText(defaultHost);
      tfServer.setEditable(false);
      tfPort.setEditable(false);
      tf.removeActionListener(this);
      connected = false;
      }
      public void actionPerformed(ActionEvent e) {
      Object o = e.getSource();
      if(o == logout) {
      client.sendMessage(new ChatMessage(ChatMessage.LOGOUT, ""));
      return;
      }
      if(o == whoIsIn) {
      client.sendMessage(new ChatMessage(ChatMessage.WHOISIN, ""));
      return;
      }

      if(connected) {
      client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, tf.getText()));
      tf.setText("");
      return;
      }

      if(o == login) {
      String username = tf.getText().trim();
      if(username.length() == 0)
      return;
      String server = tfServer.getText().trim();
      if(server.length() == 0)
      return;
      String portNumber = tfPort.getText().trim();
      if(portNumber.length() == 0)
      return;
      int port = 0;
      try {
      port = Integer.parseInt(portNumber);
      }
      catch(Exception en) {
      return;   
      }

      client = new Client(server, port, username, this);
      if(!client.start()) 
      return;
      tf.setText("");
      label.setText("Enter your message below");
      connected = true;
      login.setEnabled(false);
      logout.setEnabled(true);
      whoIsIn.setEnabled(true);
      tfServer.setEditable(false);
      tfPort.setEditable(false);
      tf.addActionListener(this);
      }

      }


      public static void main(String[] args) {
      new ClientGUI("localhost", 1500);
      }

      }
    2. ************************************************************************************************
    3. Server.java

    4. import java.io.*;
      import java.net.*;
      import java.text.SimpleDateFormat;
      import java.util.*;
      public class Server {
      private static int uniqueId;
      private ArrayList<ClientThread> al;
      private ServerGUI sg;
      private SimpleDateFormat sdf;
      private int port;
      private boolean keepGoing;
      public Server(int port) {
      this(port, null);
      }
      public Server(int port, ServerGUI sg) {
      this.sg = sg;
      this.port = port;
      sdf = new SimpleDateFormat("HH:mm:ss");
      al = new ArrayList<ClientThread>();
      }
      public void start() {
      keepGoing = true;
      try 
      {
      ServerSocket serverSocket = new ServerSocket(port);
      while(keepGoing) 
      {
      display("Server waiting for Clients on port " + port + ".");
      Socket socket = serverSocket.accept();   // accept connection
      if(!keepGoing)
      break;
      ClientThread t = new ClientThread(socket);  // make a thread of it
      al.add(t); // save it in the ArrayList
      t.start();
      }
      try {
      serverSocket.close();
      for(int i = 0; i < al.size(); ++i) {
      ClientThread tc = al.get(i);
      try {
      tc.sInput.close();
      tc.sOutput.close();
      tc.socket.close();
      }
      catch(IOException ioE) {
      }
      }
      }
      catch(Exception e) {
      display("Exception closing the server and clients: " + e);
      }
      }
      catch (IOException e) {
                  String msg = sdf.format(new Date()) + " Exception on new ServerSocket: " + e + "\n";
      display(msg);
      }
      }
      protected void stop() {
      keepGoing = false;
      try {
      new Socket("localhost", port);
      }
      catch(Exception e) {
      }
      }
      private void display(String msg) {
      String time = sdf.format(new Date()) + " " + msg;
      if(sg == null)
      System.out.println(time);
      else
      sg.appendEvent(time + "\n");
      }
      private synchronized void broadcast(String message) {
      String time = sdf.format(new Date());
      String messageLf = time + " " + message + "\n";
      if(sg == null)
      System.out.print(messageLf);
      else
      sg.appendRoom(messageLf);     // append in the room window
      for(int i = al.size(); --i >= 0;) {
      ClientThread ct = al.get(i);
      if(!ct.writeMsg(messageLf)) {
      al.remove(i);
      display("Disconnected Client " + ct.username + " removed from list.");
      }
      }
      }

      synchronized void remove(int id) {
      for(int i = 0; i < al.size(); ++i) {
      ClientThread ct = al.get(i);
      if(ct.id == id) {
      al.remove(i);
      return;
      }
      }
      }
      public static void main(String[] args) {
      int portNumber = 1500;
      switch(args.length) {
      case 1:
      try {
      portNumber = Integer.parseInt(args[0]);
      }
      catch(Exception e) {
      System.out.println("Invalid port number.");
      System.out.println("Usage is: > java Server [portNumber]");
      return;
      }
      case 0:
      break;
      default:
      System.out.println("Usage is: > java Server [portNumber]");
      return;
      }
      Server server = new Server(portNumber);
      server.start();
      }

      class ClientThread extends Thread {
      Socket socket;
      ObjectInputStream sInput;
      ObjectOutputStream sOutput;
      int id;
      String username;
      ChatMessage cm;
      String date;

      ClientThread(Socket socket) {
      id = ++uniqueId;
      this.socket = socket;
      System.out.println("Thread trying to create Object Input/Output Streams");
      try
      {
      sOutput = new ObjectOutputStream(socket.getOutputStream());
      sInput  = new ObjectInputStream(socket.getInputStream());
      username = (String) sInput.readObject();
      display(username + " just connected.");
      }
      catch (IOException e) {
      display("Exception creating new Input/output Streams: " + e);
      return;
      }
      catch (ClassNotFoundException e) {
      }
                  date = new Date().toString() + "\n";
      }

      public void run() {
      boolean keepGoing = true;
      while(keepGoing) {
      try {
      cm = (ChatMessage) sInput.readObject();
      }
      catch (IOException e) {
      display(username + " Exception reading Streams: " + e);
      break;
      }
      catch(ClassNotFoundException e2) {
      break;
      }
      String message = cm.getMessage();
      switch(cm.getType()) {

      case ChatMessage.MESSAGE:
      broadcast(username + ": " + message);
      break;
      case ChatMessage.LOGOUT:
      display(username + " disconnected with a LOGOUT message.");
      keepGoing = false;
      break;
      case ChatMessage.WHOISIN:
      writeMsg("List of the users connected at " + sdf.format(new Date()) + "\n");
      for(int i = 0; i < al.size(); ++i) {
      ClientThread ct = al.get(i);
      writeMsg((i+1) + ") " + ct.username + " since " + ct.date);
      }
      break;
      }
      }
      remove(id);
      close();
      }
      private void close() {
      try {
      if(sOutput != null) sOutput.close();
      }
      catch(Exception e) {}
      try {
      if(sInput != null) sInput.close();
      }
      catch(Exception e) {};
      try {
      if(socket != null) socket.close();
      }
      catch (Exception e) {}
      }

      private boolean writeMsg(String msg) {
      if(!socket.isConnected()) {
      close();
      return false;
      }
      try {
      sOutput.writeObject(msg);
      }
      catch(IOException e) {
      display("Error sending message to " + username);
      display(e.toString());
      }
      return true;
      }
      }
      }
    5. *********************************************************************************
    6. ServerGUI.java
    7. import javax.swing.*;
      import java.awt.*;
      import java.awt.event.*;

      public class ServerGUI extends JFrame implements ActionListener, WindowListener {
      private static final long serialVersionUID = 1L;
      private JButton stopStart;
      private JTextArea chat, event;
      private JTextField tPortNumber;
      private Server server;
      ServerGUI(int port) {
      super("Chat Server");
      server = null;
      JPanel north = new JPanel();
      north.add(new JLabel("Port number: "));
      tPortNumber = new JTextField("  " + port);
      north.add(tPortNumber);
      stopStart = new JButton("Start");
      stopStart.addActionListener(this);
      north.add(stopStart);
      add(north, BorderLayout.NORTH);
      JPanel center = new JPanel(new GridLayout(2,1));
      chat = new JTextArea(80,80);
      chat.setEditable(false);
      appendRoom("Chat room.\n");
      center.add(new JScrollPane(chat));
      event = new JTextArea(80,80);
      event.setEditable(false);
      appendEvent("Events log.\n");
      center.add(new JScrollPane(event));
      add(center);
      addWindowListener(this);
      setSize(400, 600);
      setVisible(true);
      }


      void appendRoom(String str) {
      chat.append(str);
      chat.setCaretPosition(chat.getText().length() - 1);
      }
      void appendEvent(String str) {
      event.append(str);
      event.setCaretPosition(chat.getText().length() - 1);
      }
      public void actionPerformed(ActionEvent e) {
      if(server != null) {
      server.stop();
      server = null;
      tPortNumber.setEditable(true);
      stopStart.setText("Start");
      return;
      }
           
      int port;
      try {
      port = Integer.parseInt(tPortNumber.getText().trim());
      }
      catch(Exception er) {
      appendEvent("Invalid port number");
      return;
      }
      server = new Server(port, this);
      new ServerRunning().start();
      stopStart.setText("Stop");
      tPortNumber.setEditable(false);
      }
      public static void main(String[] arg) {
      new ServerGUI(1500);
      }

      public void windowClosing(WindowEvent e) {
      if(server != null) {
      try {
      server.stop();
      }
      catch(Exception eClose) {
      }
      server = null;
      }
      dispose();
      System.exit(0);
      }
      public void windowClosed(WindowEvent e) {}
      public void windowOpened(WindowEvent e) {}
      public void windowIconified(WindowEvent e) {}
      public void windowDeiconified(WindowEvent e) {}
      public void windowActivated(WindowEvent e) {}
      public void windowDeactivated(WindowEvent e) {}

      class ServerRunning extends Thread {
      public void run() {
      server.start();        
      stopStart.setText("Start");
      tPortNumber.setEditable(true);
      appendEvent("Server crashed\n");
      server = null;
      }
      }

      }
    8. ***********************************************************************************************
    9. Note: Please do share this link to your friends or colleague.  
    10. We'll soon upload zip file of java chat application  stay tune us..

Comments

Popular posts from this blog

Java Access Specifiers and Modifiers