Public Member Functions | Private Member Functions | Private Attributes

ChatServerClient Class Reference

Chat server's threaded back-end for clients. More...

Collaboration diagram for ChatServerClient:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 ChatServerClient (ChatServer server, Socket socket)
 Creates instance of chat server's threaded back-end for specific client.
String getClientName ()
 Gets identifier of the client.
void send (String message)
 Sends message (appended with new-line) to chat server.
void run ()

Private Member Functions

void sendFromEliza (String messageFromEliza)
 Sends messages from Eliza.
void respondToMessage (String message)
 Broadcasts message, talks to Eliza, responds to "wwhhoo" command etc.

Private Attributes

ChatServer server
 Instance of the server to which this client belongs.
PrintWriter out
 Output stream to remote client.
String clientName
 Identifier of the client (remote ip addre + remote port)
Socket socket
 Connection socket to server.
volatile boolean running
 Indicates if thread is (or should be) running.
Eliza eliza
 Instance of Joseph Weizenbaum's Eliza, a simulation of a Rogerian shrink.

Detailed Description

Chat server's threaded back-end for clients.

Author:
Mikica B Kocic

Definition at line 16 of file ChatServerClient.java.


Constructor & Destructor Documentation

ChatServerClient.ChatServerClient ( ChatServer  server,
Socket  socket 
)

Creates instance of chat server's threaded back-end for specific client.

Parameters:
serverinstance of the chat server, i.e. owner of this back-end
socketsocket to remote chat client accepted by the server earlier

Definition at line 55 of file ChatServerClient.java.

References clientName, eliza, out, running, server, and socket.

    {
        this.server     = server;
        this.socket     = socket;
        this.out        = null;
        this.running    = true;
        this.eliza      = null;

        /* Setup initial client name as <addr>:<port>.
         * It will be resolved later in <hostname>:<port>, when the thread starts.
         */
        this.clientName = socket.getInetAddress ().getHostAddress () 
                        + ":" + socket.getPort ();
    }

Member Function Documentation

String ChatServerClient.getClientName (  )

Gets identifier of the client.

Definition at line 73 of file ChatServerClient.java.

References clientName.

Referenced by ChatServer.broadcast(), ChatServer.logEliza(), run(), and ChatServer.wwhhoo().

    {
        return clientName;
    }
void ChatServerClient.respondToMessage ( String  message ) [private]

Broadcasts message, talks to Eliza, responds to "wwhhoo" command etc.

Definition at line 108 of file ChatServerClient.java.

References ChatServer.broadcast(), eliza, ChatServer.getClientCount(), sendFromEliza(), server, and ChatServer.wwhhoo().

Referenced by run().

    {
        /* Parse input with syntax: [ [ <userId> ] ":: " ] <message>
         * where default userId is [Anonymous].
         */
        String textPart = message;
        String[] parts = message.split( ":: ", 2 );
        // String userId = "[Anonymous]";
        
        if ( parts.length == 0 ) {
            textPart = parts[0];
        } else if ( parts[0].trim().length () == 0 && parts.length >= 2 ) {
            textPart = parts[1];
        } else if ( parts.length >= 2 ) {
            // userId  = parts[0].trim();
            textPart = parts[1];
        } else {
            textPart = parts[0];
        }

        if ( textPart.equals( "wwhhoo" ) ) 
        {
            server.wwhhoo( this );
        }
        else if ( server.getClientCount () == 1 && eliza != null )
        {
            server.broadcast( this, message );
            sendFromEliza( eliza.processInput( textPart ) );
        }
        else if ( eliza == null && textPart.equalsIgnoreCase( "talk eliza" ) ) 
        {
            server.broadcast( this, message );
            if ( server.getClientCount () > 1 )
            {
                sendFromEliza( "We are not alone!" );
            }
            else
            {
                eliza = new Eliza( /*local=*/true, "eliza-script.txt" );
                sendFromEliza( "Hello! My name is Eliza and I am the psychoterapist. " );
                sendFromEliza( " It seems that we are alone... "
                               + "Please tell me your problem." );
            }
        }
        else
        {
            server.broadcast( this, message );
        }
    }
void ChatServerClient.run (  )

Definition at line 162 of file ChatServerClient.java.

References ChatServer.broadcast(), clientName, eliza, ChatServer.getClientCount(), getClientName(), out, ChatServer.removeClient(), respondToMessage(), running, send(), server, and socket.

    {
        // Create i/o buffers on client socket
        //
        BufferedReader in = null;
        try
        {
            this.clientName = socket.getInetAddress ().getHostName () 
                + ":" + socket.getPort ();

            in = new BufferedReader(
                    new InputStreamReader( socket.getInputStream (), "utf-8" ) );

            out = new PrintWriter(
                    new OutputStreamWriter( socket.getOutputStream(), "utf-8" ),
                    /*autoflush*/ true );

            // Live and well if reached following line
            //
            server.broadcast( null, "New client [" + getClientName() + "]" );
            
            if ( server.getClientCount() == 1 && eliza == null )
            {
                send( "[System] :: It seems that you are alone in the chat room. "
                        + "Reply with 'talk eliza' if you want to bring up Eliza..." );
            }
        }
        catch (IOException ex)
        {
            running = false;
        }

        while( running )
        {
            try
            {
                String message = in.readLine ();
                if ( message == null ) {
                    running = false;
                    break;
                }

                respondToMessage( message );
            }
            catch( IOException ex )
            {
                running = false;
            }
        }

        // On socket error or regular disconnect
        //
        server.removeClient( this );
        server.broadcast( null, "Client [" + getClientName() + "] disconnected" );
    }
void ChatServerClient.send ( String  message )

Sends message (appended with new-line) to chat server.

Parameters:
message

Definition at line 83 of file ChatServerClient.java.

References out.

Referenced by run(), and sendFromEliza().

    {
        synchronized( this )
        {
            if ( out == null || message == null ) {
                return;
            }
            
            out.println( message );
            out.flush ();
        }
    }
void ChatServerClient.sendFromEliza ( String  messageFromEliza ) [private]

Sends messages from Eliza.

Definition at line 99 of file ChatServerClient.java.

References ChatServer.logEliza(), send(), and server.

Referenced by respondToMessage().

    {
        server.logEliza( messageFromEliza, this );
        send( "Eliza :: " + messageFromEliza );
    }

Member Data Documentation

String ChatServerClient.clientName [private]

Identifier of the client (remote ip addre + remote port)

Definition at line 31 of file ChatServerClient.java.

Referenced by ChatServerClient(), getClientName(), and run().

Eliza ChatServerClient.eliza [private]

Instance of Joseph Weizenbaum's Eliza, a simulation of a Rogerian shrink.

Eliza may talk to user (if called up) if user is alone in the chat room.

Definition at line 47 of file ChatServerClient.java.

Referenced by ChatServerClient(), respondToMessage(), and run().

PrintWriter ChatServerClient.out [private]

Output stream to remote client.

Definition at line 26 of file ChatServerClient.java.

Referenced by ChatServerClient(), run(), and send().

volatile boolean ChatServerClient.running [private]

Indicates if thread is (or should be) running.

Definition at line 41 of file ChatServerClient.java.

Referenced by ChatServerClient(), and run().

Instance of the server to which this client belongs.

Definition at line 21 of file ChatServerClient.java.

Referenced by ChatServerClient(), respondToMessage(), run(), and sendFromEliza().

Socket ChatServerClient.socket [private]

Connection socket to server.

Definition at line 36 of file ChatServerClient.java.

Referenced by ChatServerClient(), and run().


The documentation for this class was generated from the following file: