FileDocCategorySizeDatePackage
Who.javaAPI DocExample3699Sat Jun 02 02:44:22 BST 2001None

Who.java

// This example is from _Java Examples in a Nutshell_. (http://www.oreilly.com)
// Copyright (c) 1997 by David Flanagan
// This example is provided WITHOUT ANY WARRANTY either expressed or implied.
// You may study, use, modify, and distribute it for non-commercial purposes.
// For any commercial use, see http://www.davidflanagan.com/javaexamples

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

/** 
 * This applet uses the connects to the "finger" server on the host
 * it was served from to determine who is currently logged on.
 * Because it is an untrusted applet, it can only connect to the host
 * from which it came.  Since web servers do not usually run finger
 * servers themselves, this applet will often be used in conjunction
 * with a proxy server, to serve it from some other host that does run
 * a finger server.
 **/
public class Who extends Applet implements ActionListener, Runnable {
  Button who;  // The button in the applet
  /**
   * The init method just creates a button to display in the applet.
   * When the user clicks the button, we'll check who is logged on.
   **/
  public void init() {
    who = new Button("Who?");
    who.setFont(new Font("SansSerif", Font.PLAIN, 14));
    who.addActionListener(this);
    who.setActionCommand("who");
    this.add(who);
  }

  /** 
   * When the button is clicked, start a thread that will connect to
   * the finger server and display who is logged on
   **/
  public void actionPerformed(ActionEvent e) {
    if (e.getActionCommand().equals("who")) new Thread(this).start();
  }

  /**
   * This is the method that does the networking and displays the results.
   * It is implemented as the body of a separate thread because it might
   * take some time to complete, and applet methods need to return promptly.
   **/
  public void run() {
    // Disable the button so we don't get multiple queries at once...
    who.setEnabled(false);

    // Create a window to display the output in
    Frame f = new CloseableFrame("Who's Logged On: Connecting...");
    TextArea t = new TextArea(10, 80);
    t.setFont(new Font("MonoSpaced", Font.PLAIN, 10));
    f.add(t, "Center");
    f.pack();
    f.show();

    // Find out  who's logged on
    Socket s = null;
    PrintWriter out = null;
    BufferedReader in = null;
    try {
      // Connect to port 79 (the standard finger port) on the host
      // that the applet was loaded from.
      String hostname = this.getCodeBase().getHost();
      s = new Socket(hostname, 79);
      // Set up the streams
      out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
      in = new BufferedReader(new InputStreamReader(s.getInputStream()));

      // Send a blank line to the finger server, telling it that we want
      // a listing of everyone logged on instead of information about an
      // individual user.
      out.println();
      out.flush();    // Send it now!

      // Now read the server's response and display it in the textarea
      String line;
      while((line = in.readLine()) != null) {
        t.append(line);
        t.append("\n");
      }
      f.setTitle("Who's Logged On: " + hostname);
    }
    // If something goes wrong, we'll just display the exception message
    catch (IOException e) { 
      t.append(e.toString()); 
      f.setTitle("Who's Logged On: Error");
    }
    // And finally, don't forget to close the streams!
    finally { try {in.close(); out.close(); s.close();} catch(Exception e){} }
    
    // And enable the button again
    who.setEnabled(true);
  }
}