Listing 2

// CB Radio Client
// 1996, Joe Novosel
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class CBclient extends Frame {
  int command ; //cb_on
  int channel=19;
  Socket s;

String hostName = new String();
  String message;
  byte[] buffer = new byte[120];
  DataOutputStream dos;
  DataInputStream dis;
  TextField channelfield;
  TextField inputfield;
  TextArea outputarea;
  CBListener listener;
  final int CB_ON=1;
  final int CB_OFF=2;
  final int SET_CHAN=3;
  final int WHO_CHAN=4;
  final int WHO_ALL=5;
  final int SVR_STATS=6;
  final int SEND_MESSAGE=7;

public static void main(String args[]){
  if ((args.length <2)||(args.length >2)){
    System.out.println("Usage: client HANDLE HOSTNAME");
    System.exit(0);
  }
  //Here we create a new instance of the client object.
    CBclient n = new CBclient(args[0],args[1]);
}

Client code begins here
     CBclient(String handle, String h){
      super(handle);
    //print the handle name in the screen header
  try{
   hostName =h ;

    for(int i =0;i<120;i++) //zero out byte array
      buffer[i]=(byte)0;
    // Change 3507 to whatever port you wish,
    // but be sure that the server
    // is listening to that port.
    Socket s = new Socket(hostName,3507);
    // create the socket
    dis = new DataInputStream(s.getInputStream());
    dos = new DataOutputStream (new
BufferedOutputStream(s.getOutputStream()));

    //Menu stuff here
    MenuBar mb = new MenuBar();
    // create the menu bar itself
    Menu mc = new Menu("Connect");
    //create a menu item "connect"
    mc.add(new MenuItem("Quit"));
    //add an item "quit" to the menu "connect"
    mc.add(new MenuItem("Who"));
    //add an item "who" to the menu "connect"
    mb.add(mc);
    //add the menu "connect" to the menu bar
    setMenuBar(mb);
    //Set up the window
    channelfield = new TextField();
    // create a TextField for channel input
    inputfield = new TextField();
    // create a TextField for user input
    outputarea=new TextArea();
    //create a TextArea for output
    outputarea.setEditable(false);
    //We don't want the user to edit output
    this.setLayout(new BorderLayout());
    //We want to use a border layout
    this.add("North", inputfield);
    // put the inputfield at the top
    this.add("Center",outputarea);
    // put the output in the center
    this.add("South",channelfield);
   // put the channel field at the bottom

Launch a CBListener thread to listen for data from server
    listener = new CBListener (dis,outputarea);

//Size and show the window
    this.resize(400,200);
    show();

//Get a packet ready to send
//We are telling the server who we are
//and that we wish to connect
//Put the handle into the byte array
//to send to server
    handle.getBytes(0,handle.length(),buffer,0);
    dos.writeInt(19);> //channel
    dos.writeInt(1);  //cb_on
    for(int i =0;i<120;i++)
   //write the byte buffer with handle and message
      dos.writeByte(buffer[i]);
    dos.flush();
   //flush the write buffer
  }catch( IOException e) {
  }
  }

// Here's were we go when the user
// interacts with the program
  public boolean action(Event e,Object what){
    try{
//If the user types something in the
//inputfield (message field)
//Get it and send to the server
      if(e.target==inputfield) {
   message = new String((String)e.arg);
   message.getBytes(0,message.length(),buffer,20);
   dos.writeInt(channel);
  //request a channel change
   dos.writeInt(SEND_MESSAGE);
  //send message
   for(int i=0;i<120;i++)
     dos.writeByte(buffer[i]);
   dos.flush();
   for (int i=19;i<120;i++)
     buffer[i]=0;
   inputfield.setText("");
}
// If the user enters something in the channelfield
// request a channel change to the server
      if(e.target==channelfield){
   dos.writeInt(Integer.parseInt(new String((String)e.arg)));
   channel = Integer.parseInt(new String((String)e.arg));
   dos.writeInt(3);
  //set channel
   for(int i=0;i<120;i++)
     dos.writeByte(buffer[i]);
   dos.flush();
   inputfield.setText("");
      }
// If the user selects an item from the menu
// Process that item
   if(e.target instanceof MenuItem){
   String label = new String((String)e.arg);
   // The user wants to quit, send a CB_OFF
        // command to the server
   // and shut things down here
   if(label.equals("Quit")){
     dos.writeInt(channel);
     dos.writeInt(CB_OFF); //cb off
       for(int i=0;i<120;i++)
         dos.writeByte(buffer[i]);
   listener.stop();
        //Stop the listener thread
     dos.flush();
        //Flush the buffer to make sure
        //server has everything
          System.exit(0);  //Bye Bye now!

}
   // Process the who command
   // This will return a list (from the server)
        // of all clients on our channel
   if(label.equals("Who")){
   dos.writeInt(channel);
   dos.writeInt(WHO_CHAN);
        //who_chann  who's on this channel
   for(int i=0;i<120;i++)
     dos.writeByte(buffer[i]);
   dos.flush();}
}
      return true;}
      // return that we've handled the event
      catch(IOException ve) {
   System.out.println("error io exception");}

      return true;
    }

}