/* Name: Huy Nguyen Lab # 5 */ import java.net.*; import java.io.*; import java.util.*; import java.awt.event.*; import java.awt.*; import java.applet.*; class P { static final String HOST = ".ics.uci.edu"; static final int PORT = 9608; static final int LOGIN = 1; static final int LOGOUT = 2; static final int MSG = 3; static final String DELIMITER_1 = " "; } public class ChatClient extends Frame { ChatControlPanel chatControl; MenuBar ControlBar; Menu Connection, Task; MenuItem login, logout, clear, send; RandomMessages RM; ChatClient(String machine) { super(); setSize(500,500); chatControl = new ChatControlPanel(machine,this); add(chatControl); setVisible(true); setTitle("Chat Client Window"); Connection = new Menu("Connection"); login = new MenuItem( "New user"); logout = new MenuItem( "Close user"); logout.setEnabled(false); login.addActionListener( new MyListener()); logout.addActionListener( new MyListener()); Connection.add(login ); Connection.add(logout); Task = new Menu("Task"); send = new MenuItem( "Send random message" ); clear = new MenuItem( "Clear message center"); send.addActionListener( new MyListener()); clear.addActionListener( new MyListener()); Task.add(send); Task.add(clear); ControlBar = new MenuBar(); ControlBar.add( Connection); ControlBar.add( Task); setMenuBar(ControlBar); show(); } class MyListener implements ActionListener { public void actionPerformed(ActionEvent e) { MenuItem choice = (MenuItem)e.getSource(); if ( choice == login && chatControl.InputMesg.logon == false ) chatControl.OutputMesg.append("you must type 'username' + 'login' to login"); else if ( choice == logout ) chatControl.InputMesg.sendLogout(); else if(choice == clear ) chatControl.OutputMesg.clearWindow(); else if (choice == send) chatControl.InputMesg.sendMessage(RM.RanOut()); } } public static void main(String[] args) { ChatClient c = new ChatClient(args[0]); } } /* ------------------------------------Chat Control Panel -----------------------------------*/ class ChatControlPanel extends Panel { ChatInputMessage InputMesg; ChatTextDisplay OutputMesg; ChatClient parentFrame; String machine; ChatControlPanel(String machine, ChatClient parentFrame) { this.parentFrame = parentFrame; ClientConnection Client = new ClientConnection(machine + P.HOST, P.PORT, this); InputMesg = new ChatInputMessage(Client,this); OutputMesg = new ChatTextDisplay(Client); add(OutputMesg); add(InputMesg); } } class ChatInputMessage extends Panel { ClientConnection Client; ChatControlPanel parentControl; TextField TextInput; boolean logon; String user; ChatInputMessage(ClientConnection Client, ChatControlPanel parentControl) { this.Client = Client; this.parentControl = parentControl; TextInput = new TextField(50); TextInput.setEditable(true); TextInput.addActionListener( new MyListener()); add( TextInput ); logon = false; } class MyListener implements ActionListener { public void actionPerformed(ActionEvent e) { messageHandler( TextInput.getText()); } } void messageHandler( String str ) { StringTokenizer tokens = new StringTokenizer(str); if ( logon == false ) { if ( tokens.countTokens() < 2 ) //user name and command TextInput.setText( "Invalid format, see 'Help'" ); else { user = tokens.nextToken(); String command = tokens.nextToken(); if ( command.equals("login") || command.equals("logon") ) { logon = true; parentControl.parentFrame.login.setEnabled(false); parentControl.parentFrame.logout.setEnabled(true); Client.newSocket(); System.out.println("new Client socket"); Client.outToServer.println(user + " " + P.LOGIN); TextInput.setText(" "); } else TextInput.setText("You must login first"); } } else { String next = tokens.nextToken(); if ( next.equals("logoff") || next.equals("logout") ) sendLogout(); else sendMessage(str); } } void sendLogout() { Client.outToServer.println(user + " "+ P.LOGOUT); //parentControl.OutputMesg.append(user+ " has LOGGED OFF"); //Client.close(); System.out.println("Client logged out"); parentControl.parentFrame.login.setEnabled(true); parentControl.parentFrame.logout.setEnabled(false); } void sendMessage(String str) { Client.outToServer.println(user + " "+ P.MSG + " " + str); TextInput.setText(""); System.out.println("Client sent a message"); } } /*-------------------------------Chat Text Display: output the text from server -------------*/ class ChatTextDisplay extends TextArea { ClientConnection Client; ChatTextDisplay(ClientConnection Client) { super("Message Center: \n",30,50,SCROLLBARS_VERTICAL_ONLY); this.Client = Client; setEditable(false); } void appendMessage( String s ) { StringTokenizer st = new StringTokenizer(s); String temp = new String(); String user = st.nextToken(); temp = st.nextToken(); int i = Integer.parseInt(temp); if ( i == P.MSG || i== P.LOGIN ) append( filterMessage(user,s)); else// if ( Integer.parseInt(temp) == P.LOGOUT) { append( filterMessage(user,s)); Client.close(); } //else //append(s); System.out.println("append a message"); } public void clearWindow() { setText("Message Center: \n"); } String filterMessage(String user,String s) { int i = s.indexOf(new String("3")); String temp = s.substring(i+1); String mesg = new String(user + ": " + temp); return mesg; } } /*------------------------ class Client Connection: is a runable which has a socket in it --------*/ class ClientConnection implements Runnable { ChatControlPanel parentControl; BufferedReader inFromServer; PrintWriter outToServer; Socket socket; String user,host; int port; Thread t; public ClientConnection(String host, int port,ChatControlPanel parentControl) { this.parentControl = parentControl; this.host = host; this.port = port; } void newSocket() { try { socket = new Socket(host,port); t = new Thread(this); t.start(); System.out.println("new socket for client"); } catch(UnknownHostException u) {System.out.println("Unknown host");} catch (IOException e ) { System.out.println("IO 2"); } try { outToServer = new PrintWriter(socket.getOutputStream(),true); inFromServer = new BufferedReader( new InputStreamReader(socket.getInputStream())); } catch (Exception e) { System.out.println("Exception " + e); close(); } } void sendLogin() { outToServer.println(user + " " + P.LOGIN); } void sendLogout() { outToServer.println(user + " " + P.LOGOUT); } void close() { sendLogout(); try { outToServer.close(); inFromServer.close(); socket = null; t.stop(); System.out.println("close a socket on client"); } catch( IOException e) { System.out.println("Can't close");} } public void run() { while (true){ String mesg = new String(); try { mesg = inFromServer.readLine(); System.out.println("receive from server " + mesg); parentControl.OutputMesg.appendMessage(mesg + "\n"); // t.sleep(100); } catch (IOException e) { System.out.println("IO 1");} //catch (InterruptedException ie) {System.out.println("Interrupt 1");} } } }