Chat Program in JAVA

Started by Kalyan, Jul 20, 2008, 05:49 PM

Previous topic - Next topic

Kalyan

Chat

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

public class chat_all extends HttpServlet
{
   private Hashtable   RoomPool;
   private Hashtable   AppletPool;

   public void init() throws ServletException
   {
      super.init();
      RoomPool   = new Hashtable();
      AppletPool   = new Hashtable();

      new cChatServer( this, 5432 );
   }

   //---

   public void service( HttpServletRequest _req, HttpServletResponse _res) throws ServletException, IOException
   {
      String applet   = _req.getParameter( "applet" );
      if ( applet != null )
         appletRequest( _req, _res );
      else
      {
         String Room   = _req.getParameter( "room" );
         String User = _req.getParameter( "user" );
         String Mess = _req.getParameter( "message" );

         if ( Room == null )
         {
            _res.setStatus( HttpServletResponse.SC_NO_CONTENT );
            return;
         }

         if ( (User != null && Mess != null) &&
             (User.length() != 0 && Mess.length() != 0 ))
            addMessaage( Room, User, Mess );

         sendUpdate( Room, User, _res );
      }
   }

   //---

   public void acceptNewApplet( Socket _sPort )
   {
      cAppletSession   aS = new cAppletSession( this, _sPort );
      AppletPool.put( _sPort, aS );
      aS.start();
   }

   //---

   public synchronized void killApplet( cAppletSession _aS )
   {
      if ( _aS.lastRoom == null )
         AppletPool.remove( _aS.sPort );
      else
         ((cRoom)RoomPool.get(_aS.lastRoom)).removeApplet( _aS );
   }

   //---

   public void appletSocketNewMessage( String _LineIn, cAppletSession _aS )
   {
      StringTokenizer st = new StringTokenizer( _LineIn, "##" );

      String Room   = st.nextToken();
      String User = st.nextToken();
      String Mess = st.nextToken();

      if ( Room == null || Room.length() == 0 )
         return;

      if ( _aS.lastRoom == null )
         AppletPool.remove( _aS.sPort );

      cRoom rm = getRoom( Room, _aS );
      rm.addMessage( Mess, User );
   }

   //---

   private cRoom getRoom( String _Room, cAppletSession _aS )
   {
      cRoom rm;

      if ( _Room.equals( _aS.lastRoom ) == false )
      {
         if ( _aS.lastRoom == null || RoomPool.containsKey( _aS.lastRoom ) )
         {
            if ( _aS.lastRoom != null )
               ((cRoom)RoomPool.get(_aS.lastRoom)).removeApplet( _aS );
         }

         if ( RoomPool.containsKey( _Room ) )
         {
            rm = (cRoom)RoomPool.get( _Room );
            rm.addApplet( _aS );
         }
         else
         {
            rm = new cRoom();
            RoomPool.put( _Room, rm );
            rm.addApplet( _aS );
         }
         _aS.lastRoom = _Room;
      }
      else
         rm = (cRoom)RoomPool.get(_Room);

      return rm;
   }

   //---

   private void appletRequest( HttpServletRequest _req, HttpServletResponse _res) throws IOException
   {
      int id = Integer.parseInt( _req.getParameter( "applet" ) );
      String message  = _req.getParameter( "message" );
      String Room      = _req.getParameter( "room" );

      if ( message != null )
      {
         StringTokenizer st = new StringTokenizer( message, "##" );
         String User = st.nextToken();
         String Mess = st.nextToken();

         if ( (User != null && Mess != null) &&
             (User.length() != 0 && Mess.length() != 0 ))
            addMessaage( Room, User, Mess );
      }

      //- Send out the message
      if ( RoomPool.containsKey( Room ) )
      {
         cRoom   Rm = (cRoom)RoomPool.get( Room );
         Vector   vList = Rm.getMessagePool();
         cChatMessage cMess;
         _res.setContentType("text/plain");
         PrintWriter Out = new PrintWriter( _res.getOutputStream() );

         for ( int x=vList.size()-1; x >= 0; x-- )
         {
            cMess   = (cChatMessage)vList.elementAt( x );
            if ( cMess.id > id )
               Out.println( cMess.id + "##" + cMess.User + "##" + cMess.Message );
         }

         Out.flush();
      }
   }

   //---

   private void sendUpdate( String _Room, String _User, HttpServletResponse _res ) throws IOException
   {
      cRoom   Room = (cRoom)RoomPool.get( _Room );
      if ( _User == null )
         _User = "";

      _res.setContentType("text/html");
      PrintWriter Out = new PrintWriter( _res.getOutputStream() );

      Out.println( "<HTML><HEAD><TITLE>HTML Chat</TITLE>" );
      Out.println( "<META HTTP-EQUIV=REFRESH CONTENT=\"30;URL=/chat.html?room=" + _Room + "&user=" + _User + "\"></HEAD>" );
      Out.println( "<BODY TEXT=#000000 BGCOLOR=#FFFFFF LINK=#0000EE VLINK=#551A8B ALINK=#FF0000><BR>" );
         Out.println( "<CENTER><BR><FONT COLOR=#0000FF SIZE=+2>");
      Out.println( "#" + _Room + "</FONT>" );
      Out.println( "<BR><FORM METHOD=POST ACTION=/chat.html>" );
      Out.println( "Message: <INPUT TYPE=TEXT NAME=message VALUE=\"\" SIZE=32>");
      Out.println( "<INPUT TYPE=SUBMIT VALUE=Chat>");
      Out.println( "<INPUT TYPE=TEXT NAME=user VALUE=\"" + _User + "\" SIZE=10> :User" );
      Out.println( "<INPUT TYPE=HIDDEN NAME=room VALUE=" + _Room + "></CENTER>" );
      Out.println( "<HR ALIGN=CENTER WIDTH=60%>" );

      cChatMessage UD;
      Vector RoomMessages=null;
      int size;

      if ( Room != null )
         RoomMessages = Room.getMessagePool();

      if ( Room == null || RoomMessages == null )
         size = 0;
      else if ( RoomMessages.size() < 10 )
         size = RoomMessages.size();
      else
         size = 10;

      for ( int x=0; x < size; x++ )
      {
         UD = (cChatMessage)RoomMessages.elementAt( x );
         Out.println( "<BR><P><FONT COLOR=#0000FF SIZE=+1>" + UD.User + "</FONT> " + UD.Posted.toGMTString() );
         Out.println( "<BR>" + UD.Message + "</P>" );
      }

      Out.println( "<HR ALIGN=CENTER WIDTH=60%></BODY></HTML>" );
      Out.flush();
   }

   //---

   private void addMessaage( String _Room, String _User, String _Mess )
   {
      cRoom Room;

      //- Create the room is doens't already exist
      if ( RoomPool.containsKey( _Room ) == false )
      {
         synchronized( RoomPool )
         {
            Room = new cRoom();
            RoomPool.put( _Room, Room );
         }
      }
      else
         Room    = (cRoom)RoomPool.get( _Room );

      synchronized( Room )
      {
         Room.addMessage( _Mess, _User );
      }
   }
}

//--------------------------

class cRoom extends Object
{
   Vector      MessagePool;
   Hashtable   AppletPool;
   private int   idPool;

   public cRoom()
   {
      MessagePool   = new Vector();
      AppletPool   = new Hashtable();
      idPool      = 0;
   }

   public synchronized void addMessage( String _Mess, String _User )
   {
      idPool++;
      MessagePool.insertElementAt( new cChatMessage( _Mess, _User, idPool ) ,0 );
      if ( MessagePool.size() > 50 )
         MessagePool.setSize( 50 );

      //- Send out to the applets
      Enumeration E = AppletPool.elements();
      while ( E.hasMoreElements() )
         ((cAppletSession)E.nextElement()).sendMessage( _User, _Mess );
   }

   public Vector getMessagePool()
   {
      return MessagePool;
   }

   public void addApplet( cAppletSession _aS )
   {
      if ( AppletPool.containsKey( _aS.sPort ) == false )
         AppletPool.put( _aS.sPort, _aS );
   }

   public void removeApplet( cAppletSession _aS )
   {
      if ( AppletPool.containsKey( _aS.sPort ) )
         AppletPool.remove( _aS.sPort );
   }
}

//--------------------------

class cChatMessage extends Object
{
   public String   Message;
   public String   User;
   public Date      Posted;
   public int      id;

   public cChatMessage( String _Message, String _User, int _id )
   {
      Message = _Message;
      User   = _User;
      Posted   = new Date();
      id      = _id;
   }
}

//--------------------------

class cChatServer implements Runnable
{
   Thread t;
   int   Port;
   chat_all Parent;

   public cChatServer( chat_all _Parent, int _Port )
   {
      Port   = _Port;
      Parent   = _Parent;
      t      = new Thread( this );
      t.start();
   }

   public void run()
   {
      try
      {
         ServerSocket   ChatServer  = new ServerSocket( Port );
         for(;;)
         {
            Socket NewIncoming = ChatServer.accept();
            Parent.acceptNewApplet( NewIncoming );
         }
      }
      catch( Exception e )
      {}
   }
}

//--------------------------

class cAppletSession extends Thread
{
   public Integer sPort;
   public Socket iPort;
   PrintStream Out = null;
   public String lastRoom = null;
   static chat_all   Parent=null;

   public cAppletSession( chat_all _Parent, Socket _sPort )
   {
      sPort   = new Integer( _sPort.getPort() );
      iPort   = _sPort;
      Parent   = _Parent;
   }

   public void run()
   {
      DataInputStream In;

      try
      {
         In   = new DataInputStream( iPort.getInputStream() );
         Out   = new PrintStream( iPort.getOutputStream() );
      }
      catch( Exception E )
      {
         return;
      }

      try
      {
         String LineIn;
         while ( (LineIn=In.readLine())!=null)
            Parent.appletSocketNewMessage( LineIn, this );

         iPort.close();
      }
      catch( Exception E )
      {}

      Parent.killApplet( this );
   }

   //---

   public void sendMessage( String _User, String _Message )
   {
      try
      {
         Out.println( _User + "##" + _Message );
      }
      catch( Exception E )
      {
         Parent.killApplet( this );
      }
   }
}

//-------------
//- End of file
//-------------