Wednesday, June 11, 2008

Multi-threaded programming - Multithreaded chat application in java

This is the server and the client program thatI wrote basically it gives u a good understanding of how sockets work in java .

/*This is the server for the MultiThreadedChatClient program thatI 
 wrote basically it gives u a good understanding of how sockets 
 work in java
 Author: Mohammed Alfaaz
 email:alfaaz@gmail.com
 */
import java.io.*;
import java.net.*;

public class MultiThreadChatServer
{

  // Declaration section:
  // declare a server socket and a client socket for the server
  // declare an input and an output stream

  static Socket clientSocket = null;
  static ServerSocket serverSocket = null;

  // This chat server can accept up to 10 clients' connections

  static clientThread t[] = new clientThread[10];

  public static void main(String args[])
  {

    // The default port

    int port_number = 8888;

    if (args.length < 1)
    {
      System.out.println("Usage: java MultiThreadChatServer " + 
          "Now using port number=" + port_number);
    } else
    {
      port_number = Integer.valueOf(args[0]).intValue();
    }

    // Initialization section:
    // Try to open a server socket on port port_number (default 8888)
    // Note that we can't choose a port less than 1023 if we are not
    // privileged users (root)

    try
    {
      serverSocket = new ServerSocket(port_number);
    }// try
    catch (IOException e)
    {
      System.out.println(e);
    }

    // Create a socket object from the ServerSocket to listen and accept
    // connections.
    // Open input and output streams for this socket will be created in
    // client's thread since every client is served by the server in
    // an individual thread

    // can use a for loop to control the number of clients
    // I have used the while so that we can have unlimited number of clients
    while (true)
    {
      try
      {
        clientSocket = serverSocket.accept();
        new clientThread(clientSocket, t).start();
        break;
      }// try

      catch (IOException e)
      {
        System.out.println(e);
      }
    }
  }
} // class

// This client thread opens the input and the output streams for a
// particular client, ask the client's name, informs all the clients
// currently connected to the server about the fact that a new client
// has joined the chat room, and as long as it receive data,
// echos that data back to all other clients.
// When the client leaves the chat room this thread informs also all
// the clients about that and terminates.

class clientThread extends Thread
{

  DataInputStream is = null;
  PrintStream os = null;
  Socket clientSocket = null;
  clientThread t[];

  public clientThread(Socket clientSocket, clientThread[] t)
  {
    this.clientSocket = clientSocket;
    this.t = t;
  }

  public void run()
  {
    String line;
    String name;
    try
    {
      is = new DataInputStream(clientSocket.getInputStream());
      os = new PrintStream(clientSocket.getOutputStream());
      os.println("Enter your name.");
      name = is.readLine(); // Recommends BufferedReader.readLine() method.
      os.println("Hello " + name + " to our chat room.To leave enter /quit in a new line");
      for (int i = 0; i <= 9; i++)
        if (t[i] != null && t[i] != this)
          t[i].os.println("*** A new user " + name + " entered the chat room !!!***");
      while (true)
      {
        line = is.readLine();
        if (line.startsWith("/quit"))
          break;
        for (int i = 0; i <= 9; i++)
          if (t[i] != null)
            t[i].os.println("<" + name + "> " + line);
      }
      for (int i = 0; i <= 9; i++)
        if (t[i] != null && t[i] != this)
          t[i].os.println("*** The user " + name + " is leaving the chat room !!!***");

      os.println("*** Bye " + name + " ***");

      // Clean up:
      // Set to null the current thread variable such that other client
      // could be accepted by the server

      for (int i = 0; i <= 9; i++)
        if (t[i] == this)
          t[i] = null;

      // close the output stream
      // close the input stream
      // close the socket

      is.close();
      os.close();
      clientSocket.close();
    } catch (IOException e)
    {
    };
  }
}
/*This is the client for the MultiThreadedChatServer program thatI 
 wrote basically it gives u a good understanding of how sockets 
 work in java
 Author: Mohammed Alfaaz
 email:alfaaz@gmail.com
 */

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

public class MultiThreadChatClient implements Runnable
{

  // Declaration section
  // clientClient: the client socket
  // os: the output stream
  // is: the input stream

  static Socket clientSocket = null;
  static PrintStream os = null;
  static DataInputStream is = null;
  static BufferedReader inputLine = null;
  static boolean closed = false;

  public static void main(String[] args)
  {

    // The default port

    int port_number = 8888;
    String host = "localhost";

    if (args.length < 2)
    {
      System.out.println("Usage: java MultiThreadChatClient " + 
          "Now using host=" + host + ", port_number="
          + port_number);
    } else
    {
      host = args[0];
      port_number = Integer.valueOf(args[1]).intValue();
    }
    // Initialization section:
    // Try to open a socket on a given host and port
    // Try to open input and output streams
    try
    {
      clientSocket = new Socket(host, port_number);
      inputLine = new BufferedReader(new InputStreamReader(System.in));
      os = new PrintStream(clientSocket.getOutputStream());
      is = new DataInputStream(clientSocket.getInputStream());
    } catch (UnknownHostException e)
    {
      System.err.println("Don't know about host " + host);
    } catch (IOException e)
    {
      System.err.println("Couldn't get I/O for the connection to the host " + host);
    }

    // If everything has been initialized then we want to write some data
    // to the socket we have opened a connection to on port port_number

    if (clientSocket != null && os != null && is != null)
    {
      try
      {

        // Create a thread to read from the server

        new Thread(new MultiThreadChatClient()).start();

        while (!closed)
        {
          os.println(inputLine.readLine());
        }

        // Clean up:
        // close the output stream
        // close the input stream
        // close the socket

        os.close();
        is.close();
        clientSocket.close();
      } catch (IOException e)
      {
        System.err.println("IOException:  " + e);
      }
    }
  }

  public void run()
  {
    String responseLine;

    // Keep on reading from the socket till we receive the "Bye" from the
    // server,once we received that then we want to break.
    try
    {
      while ((responseLine = is.readLine()) != null)
      {
        System.out.println(responseLine);
        if (responseLine.indexOf("*** Bye") != -1)
          break;
      }
      closed = true;
    } catch (IOException e)
    {
      System.err.println("IOException:  " + e);
    }
  }
}
 
Blogger Template Layout Design by [ METAMUSE ] : Code Name Gadget 1.1 Power By freecode-frecode.blogger.com & blogger.com Programming Blogs - BlogCatalog Blog Directory