ProtocolRunner.java Source code

Java tutorial

Introduction

Here is the source code for ProtocolRunner.java

Source

    /*
     * ProtocolRunner.java
     *
     * Created on 22 December 2003, 12:57
     */
    // Import Java Packages
    import java.awt.Point;
    import java.awt.Frame;
    import java.awt.Toolkit;
    import java.awt.Dimension;
    import java.awt.Component;
    import java.io.IOException;

    import javax.swing.JLabel;
    import javax.swing.JDialog;
    import javax.swing.UIManager;
    import javax.swing.JComboBox;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.JOptionPane;
    import java.net.SocketException;

    import java.io.File;
    import java.util.Date;
    import java.util.Calendar;
    import javax.swing.JDialog;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.GregorianCalendar;

    // Import NET Packages
    import org.apache.commons.net.*;
    import org.apache.commons.net.io.*;
    import org.apache.commons.net.ftp.*;
    import org.apache.commons.net.nntp.*;
    import org.apache.commons.net.pop3.*;
    import org.apache.commons.net.smtp.*;
    import org.apache.commons.net.tftp.*;

/**
 * ProtocolRunner class exercises the various protocols available in the
 * Commons Net Package
 * @author  Vikram Goyal
 */
public class ProtocolRunner extends javax.swing.JFrame {
    
    /** Creates new form ProtocolRunner */
    public ProtocolRunner() { 
        // set the native look and feel
        try{
            UIManager.setLookAndFeel(
                UIManager.getSystemLookAndFeelClassName());
        }catch(Exception e) {}
        
        initComponents();
        // size it so that it appears full screen
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        this.setSize(screen.width, screen.height);
        this.pack();
        this.setExtendedState(Frame.MAXIMIZED_BOTH);
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        ftpPanel = new javax.swing.JPanel();
        jRadioButton4 = new javax.swing.JRadioButton();
        jRadioButton8 = new javax.swing.JRadioButton();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton3 = new javax.swing.JRadioButton();
        jRadioButton5 = new javax.swing.JRadioButton();
        jRadioButton6 = new javax.swing.JRadioButton();
        jRadioButton7 = new javax.swing.JRadioButton();
        nntpPanel = new javax.swing.JPanel();
        jRadioButton10 = new javax.swing.JRadioButton();
        jRadioButton15 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        jRadioButton11 = new javax.swing.JRadioButton();
        jRadioButton12 = new javax.swing.JRadioButton();
        jRadioButton13 = new javax.swing.JRadioButton();
        jRadioButton14 = new javax.swing.JRadioButton();
        smtpPanel = new javax.swing.JPanel();
        jRadioButton17 = new javax.swing.JRadioButton();
        jRadioButton18 = new javax.swing.JRadioButton();
        jRadioButton16 = new javax.swing.JRadioButton();
        pop3Panel = new javax.swing.JPanel();
        jRadioButton19 = new javax.swing.JRadioButton();
        jRadioButton20 = new javax.swing.JRadioButton();
        jRadioButton21 = new javax.swing.JRadioButton();
        jRadioButton22 = new javax.swing.JRadioButton();
        jRadioButton23 = new javax.swing.JRadioButton();
        jRadioButton24 = new javax.swing.JRadioButton();
        jRadioButton9 = new javax.swing.JRadioButton();
        ftpButtonGroup = new javax.swing.ButtonGroup();
        nntpButtonGroup = new javax.swing.ButtonGroup();
        smtpButtonGroup = new javax.swing.ButtonGroup();
        pop3ButtonGroup = new javax.swing.ButtonGroup();
        tftpPanel = new javax.swing.JPanel();
        jRadioButton25 = new javax.swing.JRadioButton();
        jRadioButton26 = new javax.swing.JRadioButton();
        tftpPanelButtonGroup = new javax.swing.ButtonGroup();
        loginDialog = new javax.swing.JDialog();
        jLabel9 = new javax.swing.JLabel();
        jPanel13 = new javax.swing.JPanel();
        jLabel10 = new javax.swing.JLabel();
        loginUsername = new javax.swing.JTextField();
        jLabel11 = new javax.swing.JLabel();
        loginPassword = new javax.swing.JPasswordField();
        jPanel14 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        singleValueDialog = new javax.swing.JDialog();
        jLabel12 = new javax.swing.JLabel();
        jPanel15 = new javax.swing.JPanel();
        singleValueLabel = new javax.swing.JLabel();
        singleValueField = new javax.swing.JTextField();
        jPanel16 = new javax.swing.JPanel();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        multipleValueDialog = new javax.swing.JDialog();
        jLabel13 = new javax.swing.JLabel();
        jPanel17 = new javax.swing.JPanel();
        jButton5 = new javax.swing.JButton();
        jButton6 = new javax.swing.JButton();
        jPanel18 = new javax.swing.JPanel();
        jLabel16 = new javax.swing.JLabel();
        jScrollPane3 = new javax.swing.JScrollPane();
        messageArea = new javax.swing.JTextArea();
        jPanel19 = new javax.swing.JPanel();
        jLabel14 = new javax.swing.JLabel();
        fromField = new javax.swing.JTextField();
        jLabel15 = new javax.swing.JLabel();
        subjectField = new javax.swing.JTextField();
        variableLabel = new javax.swing.JLabel();
        variableField = new javax.swing.JTextField();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        jPanel4 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        tcpServerResponse = new javax.swing.JTextArea();
        jPanel7 = new javax.swing.JPanel();
        presetPanel = new javax.swing.JPanel();
        defaultPanel = new javax.swing.JPanel();
        jLabel5 = new javax.swing.JLabel();
        jPanel9 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();
        commandBox = new javax.swing.JTextField();
        jPanel5 = new javax.swing.JPanel();
        jPanel6 = new javax.swing.JPanel();
        jLabel3 = new javax.swing.JLabel();
        tcpSelectionBox = new javax.swing.JComboBox();
        jPanel3 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        serverNameField = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        portNumberField = new javax.swing.JTextField();
        tcpConnectButton = new javax.swing.JButton();
        jPanel2 = new javax.swing.JPanel();
        jPanel10 = new javax.swing.JPanel();
        jPanel8 = new javax.swing.JPanel();
        jLabel6 = new javax.swing.JLabel();
        udpSelectionBox = new javax.swing.JComboBox();
        jPanel12 = new javax.swing.JPanel();
        jLabel7 = new javax.swing.JLabel();
        udpRemoteServerField = new javax.swing.JTextField();
        jPanel11 = new javax.swing.JPanel();
        udpCommandPanel = new javax.swing.JPanel();
        udpStartButton = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        udpServerResponse = new javax.swing.JTextArea();

        ftpPanel.setLayout(new java.awt.GridLayout(3, 3));

        jRadioButton4.setText("Login");
        ftpButtonGroup.add(jRadioButton4);
        jRadioButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton4ActionPerformed(evt);
            }
        });

        ftpPanel.add(jRadioButton4);

        jRadioButton8.setText("Logout");
        ftpButtonGroup.add(jRadioButton8);
        jRadioButton8.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton8ActionPerformed(evt);
            }
        });

        ftpPanel.add(jRadioButton8);

        jRadioButton1.setText("Change Working Directory");
        ftpButtonGroup.add(jRadioButton1);
        jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton1ActionPerformed(evt);
            }
        });

        ftpPanel.add(jRadioButton1);

        jRadioButton3.setText("List Files");
        ftpButtonGroup.add(jRadioButton3);
        jRadioButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton3ActionPerformed(evt);
            }
        });

        ftpPanel.add(jRadioButton3);

        jRadioButton5.setText("Make Directory");
        ftpButtonGroup.add(jRadioButton5);
        jRadioButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton5ActionPerformed(evt);
            }
        });

        ftpPanel.add(jRadioButton5);

        jRadioButton6.setText("Upload File");
        ftpButtonGroup.add(jRadioButton6);
        jRadioButton6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton6ActionPerformed(evt);
            }
        });

        ftpPanel.add(jRadioButton6);

        jRadioButton7.setText("Download File");
        ftpButtonGroup.add(jRadioButton7);
        jRadioButton7.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton7ActionPerformed(evt);
            }
        });

        ftpPanel.add(jRadioButton7);

        nntpPanel.setLayout(new java.awt.GridLayout(3, 3));

        jRadioButton10.setText("Login");
        nntpButtonGroup.add(jRadioButton10);
        jRadioButton10.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton10ActionPerformed(evt);
            }
        });

        nntpPanel.add(jRadioButton10);

        jRadioButton15.setText("Logout");
        nntpButtonGroup.add(jRadioButton15);
        jRadioButton15.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton15ActionPerformed(evt);
            }
        });

        nntpPanel.add(jRadioButton15);

        jRadioButton2.setText("List All NewsGroups");
        nntpButtonGroup.add(jRadioButton2);
        jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton2ActionPerformed(evt);
            }
        });

        nntpPanel.add(jRadioButton2);

        jRadioButton11.setText("List New NewsGroups");
        nntpButtonGroup.add(jRadioButton11);
        jRadioButton11.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton11ActionPerformed(evt);
            }
        });

        nntpPanel.add(jRadioButton11);

        jRadioButton12.setText("List New News");
        nntpButtonGroup.add(jRadioButton12);
        jRadioButton12.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton12ActionPerformed(evt);
            }
        });

        nntpPanel.add(jRadioButton12);

        jRadioButton13.setText("Post Article");
        nntpButtonGroup.add(jRadioButton13);
        jRadioButton13.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton13ActionPerformed(evt);
            }
        });

        nntpPanel.add(jRadioButton13);

        jRadioButton14.setText("Get Article");
        nntpButtonGroup.add(jRadioButton14);
        jRadioButton14.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton14ActionPerformed(evt);
            }
        });

        nntpPanel.add(jRadioButton14);

        smtpPanel.setLayout(new java.awt.GridLayout(1, 1));

        jRadioButton17.setText("Login");
        smtpButtonGroup.add(jRadioButton17);
        jRadioButton17.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton17ActionPerformed(evt);
            }
        });

        smtpPanel.add(jRadioButton17);

        jRadioButton18.setText("Logout");
        smtpButtonGroup.add(jRadioButton18);
        jRadioButton18.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton18ActionPerformed(evt);
            }
        });

        smtpPanel.add(jRadioButton18);

        jRadioButton16.setText("Send Simple Message");
        smtpButtonGroup.add(jRadioButton16);
        jRadioButton16.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton16ActionPerformed(evt);
            }
        });

        smtpPanel.add(jRadioButton16);

        pop3Panel.setLayout(new java.awt.GridLayout(2, 0));

        jRadioButton19.setText("Login");
        pop3ButtonGroup.add(jRadioButton19);
        jRadioButton19.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton19ActionPerformed(evt);
            }
        });

        pop3Panel.add(jRadioButton19);

        jRadioButton20.setText("Logout");
        pop3ButtonGroup.add(jRadioButton20);
        jRadioButton20.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton20ActionPerformed(evt);
            }
        });

        pop3Panel.add(jRadioButton20);

        jRadioButton21.setText("List All Messages");
        pop3ButtonGroup.add(jRadioButton21);
        jRadioButton21.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton21ActionPerformed(evt);
            }
        });

        pop3Panel.add(jRadioButton21);

        jRadioButton22.setText("Status");
        pop3ButtonGroup.add(jRadioButton22);
        jRadioButton22.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton22ActionPerformed(evt);
            }
        });

        pop3Panel.add(jRadioButton22);

        jRadioButton23.setText("Retrieve Message");
        pop3ButtonGroup.add(jRadioButton23);
        jRadioButton23.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton23ActionPerformed(evt);
            }
        });

        pop3Panel.add(jRadioButton23);

        jRadioButton24.setText("Delete Message");
        pop3ButtonGroup.add(jRadioButton24);
        jRadioButton24.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton24ActionPerformed(evt);
            }
        });

        pop3Panel.add(jRadioButton24);

        jRadioButton9.setText("Reset");
        pop3ButtonGroup.add(jRadioButton9);
        jRadioButton9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton9ActionPerformed(evt);
            }
        });

        pop3Panel.add(jRadioButton9);

        tftpPanel.setLayout(new java.awt.GridLayout(1, 0));

        jRadioButton25.setText("Send A File");
        tftpPanelButtonGroup.add(jRadioButton25);
        jRadioButton25.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton25ActionPerformed(evt);
            }
        });

        tftpPanel.add(jRadioButton25);

        jRadioButton26.setText("Receive A File");
        tftpPanelButtonGroup.add(jRadioButton26);
        jRadioButton26.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton26ActionPerformed(evt);
            }
        });

        tftpPanel.add(jRadioButton26);

        loginDialog.getContentPane().setLayout(new java.awt.BorderLayout(0, 5));

        loginDialog.setTitle("Input Required");
        loginDialog.setModal(true);
        loginDialog.setResizable(false);
        jLabel9.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel9.setText("Please Enter Login Details");
        loginDialog.getContentPane().add(jLabel9, java.awt.BorderLayout.NORTH);

        jPanel13.setLayout(new java.awt.GridLayout(2, 2, 5, 3));

        jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel10.setText("Username:");
        jPanel13.add(jLabel10);

        loginUsername.setColumns(15);
        jPanel13.add(loginUsername);

        jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel11.setText("Password:");
        jPanel13.add(jLabel11);

        loginPassword.setColumns(15);
        jPanel13.add(loginPassword);

        loginDialog.getContentPane().add(jPanel13, java.awt.BorderLayout.CENTER);

        jPanel14.setLayout(new java.awt.GridLayout(1, 0));

        jButton1.setText("OK");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jPanel14.add(jButton1);

        jButton2.setText("Cancel");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jPanel14.add(jButton2);

        loginDialog.getContentPane().add(jPanel14, java.awt.BorderLayout.SOUTH);

        singleValueDialog.setTitle("Input Required");
        singleValueDialog.setModal(true);
        singleValueDialog.setResizable(false);
        jLabel12.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel12.setText("Please enter a value");
        singleValueDialog.getContentPane().add(jLabel12, java.awt.BorderLayout.NORTH);

        jPanel15.setLayout(new java.awt.GridLayout(1, 0, 3, 0));

        singleValueLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jPanel15.add(singleValueLabel);

        singleValueField.setColumns(15);
        jPanel15.add(singleValueField);

        singleValueDialog.getContentPane().add(jPanel15, java.awt.BorderLayout.CENTER);

        jPanel16.setLayout(new java.awt.GridLayout(1, 0, 5, 0));

        jButton3.setText("OK");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        jPanel16.add(jButton3);

        jButton4.setText("Cancel");
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });

        jPanel16.add(jButton4);

        singleValueDialog.getContentPane().add(jPanel16, java.awt.BorderLayout.SOUTH);

        multipleValueDialog.setTitle("Input Required");
        multipleValueDialog.setModal(true);
        jLabel13.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel13.setText("Please enter the following values");
        multipleValueDialog.getContentPane().add(jLabel13, java.awt.BorderLayout.NORTH);

        jPanel17.setLayout(new java.awt.GridLayout(1, 0, 5, 0));

        jButton5.setText("OK");
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });

        jPanel17.add(jButton5);

        jButton6.setText("Cancel");
        jButton6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton6ActionPerformed(evt);
            }
        });

        jPanel17.add(jButton6);

        multipleValueDialog.getContentPane().add(jPanel17, java.awt.BorderLayout.SOUTH);

        jPanel18.setLayout(new java.awt.BorderLayout());

        jLabel16.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel16.setText("Enter Message:");
        jPanel18.add(jLabel16, java.awt.BorderLayout.WEST);

        messageArea.setColumns(20);
        messageArea.setRows(15);
        jScrollPane3.setViewportView(messageArea);

        jPanel18.add(jScrollPane3, java.awt.BorderLayout.CENTER);

        jPanel19.setLayout(new java.awt.GridLayout(3, 2, 3, 3));

        jLabel14.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jLabel14.setText("From:");
        jPanel19.add(jLabel14);

        fromField.setColumns(15);
        jPanel19.add(fromField);

        jLabel15.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jLabel15.setText("Subject:");
        jPanel19.add(jLabel15);

        subjectField.setColumns(15);
        jPanel19.add(subjectField);

        variableLabel.setText("Newsgroup:");
        jPanel19.add(variableLabel);

        variableField.setColumns(15);
        jPanel19.add(variableField);

        jPanel18.add(jPanel19, java.awt.BorderLayout.NORTH);

        multipleValueDialog.getContentPane().add(jPanel18, java.awt.BorderLayout.CENTER);

        setTitle("Protocol Runner");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setLayout(new java.awt.BorderLayout());

        jPanel4.setLayout(new java.awt.BorderLayout());

        jScrollPane1.setBorder(new javax.swing.border.TitledBorder("Server Output"));
        tcpServerResponse.setEditable(false);
        tcpServerResponse.setFont(new java.awt.Font("Monospaced", 0, 12));
        jScrollPane1.setViewportView(tcpServerResponse);

        jPanel4.add(jScrollPane1, java.awt.BorderLayout.CENTER);

        jPanel7.setLayout(new java.awt.GridLayout(1, 2, 5, 0));

        presetPanel.setLayout(new java.awt.BorderLayout());

        presetPanel.setBorder(new javax.swing.border.TitledBorder("Preset Commands"));
        jLabel5.setFont(new java.awt.Font("Dialog", 3, 12));
        jLabel5.setText("No Preset Commands. Simply Connect");
        defaultPanel.add(jLabel5);

        presetPanel.add(defaultPanel, java.awt.BorderLayout.CENTER);

        jPanel7.add(presetPanel);

        jPanel9.setBorder(new javax.swing.border.TitledBorder("Freeflow Commands"));
        jLabel4.setText("Type Command Here:");
        jPanel9.add(jLabel4);

        commandBox.setColumns(15);
        commandBox.setEnabled(false);
        commandBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                commandBoxActionPerformed(evt);
            }
        });

        jPanel9.add(commandBox);

        jPanel7.add(jPanel9);

        jPanel4.add(jPanel7, java.awt.BorderLayout.NORTH);

        jPanel1.add(jPanel4, java.awt.BorderLayout.CENTER);

        jPanel5.setLayout(new java.awt.GridLayout(2, 1, 0, 5));

        jPanel6.setBorder(new javax.swing.border.TitledBorder("Protocol"));
        jLabel3.setText("Select Protocol:");
        jPanel6.add(jLabel3);

        tcpSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "CharGen", "Daytime", "Echo", "Finger", "FTP", "NNTP", "POP3", "SMTP", "Time", "Whois" }));
        tcpSelectionBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tcpSelectionBoxActionPerformed(evt);
            }
        });

        jPanel6.add(tcpSelectionBox);

        jPanel5.add(jPanel6);

        jPanel3.setBorder(new javax.swing.border.TitledBorder("Server Connection Details"));
        jLabel1.setText("Server:");
        jPanel3.add(jLabel1);

        serverNameField.setColumns(25);
        jPanel3.add(serverNameField);

        jLabel2.setText("Port:");
        jPanel3.add(jLabel2);

        portNumberField.setColumns(4);
        portNumberField.setText("19");
        jPanel3.add(portNumberField);

        tcpConnectButton.setText("CONNECT");
        tcpConnectButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tcpConnectButtonActionPerformed(evt);
            }
        });

        jPanel3.add(tcpConnectButton);

        jPanel5.add(jPanel3);

        jPanel1.add(jPanel5, java.awt.BorderLayout.NORTH);

        jTabbedPane1.addTab("TCP", jPanel1);

        jPanel2.setLayout(new java.awt.BorderLayout());

        jPanel10.setLayout(new java.awt.GridLayout(2, 0));

        jPanel8.setBorder(new javax.swing.border.TitledBorder("Protocol"));
        jLabel6.setText("Select Protocol:");
        jPanel8.add(jLabel6);

        udpSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "CharGen", "Daytime", "Echo", "TFTP", "Time" }));
        udpSelectionBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                udpSelectionBoxActionPerformed(evt);
            }
        });

        jPanel8.add(udpSelectionBox);

        jPanel10.add(jPanel8);

        jPanel12.setBorder(new javax.swing.border.TitledBorder("Remote Server Details"));
        jLabel7.setText("Remote Server:");
        jPanel12.add(jLabel7);

        udpRemoteServerField.setColumns(25);
        jPanel12.add(udpRemoteServerField);

        jPanel10.add(jPanel12);

        jPanel2.add(jPanel10, java.awt.BorderLayout.NORTH);

        jPanel11.setLayout(new java.awt.BorderLayout());

        udpCommandPanel.setLayout(new java.awt.GridLayout(1, 0));

        udpCommandPanel.setBorder(new javax.swing.border.TitledBorder("Command Panel"));
        udpStartButton.setText("START");
        udpStartButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                udpStartButtonActionPerformed(evt);
            }
        });

        udpCommandPanel.add(udpStartButton);

        jPanel11.add(udpCommandPanel, java.awt.BorderLayout.NORTH);

        udpServerResponse.setEditable(false);
        udpServerResponse.setFont(new java.awt.Font("Monospaced", 0, 12));
        jScrollPane2.setViewportView(udpServerResponse);

        jPanel11.add(jScrollPane2, java.awt.BorderLayout.CENTER);

        jPanel2.add(jPanel11, java.awt.BorderLayout.CENTER);

        jTabbedPane1.addTab("UDP", jPanel2);

        getContentPane().add(jTabbedPane1, java.awt.BorderLayout.CENTER);

        pack();
    }//GEN-END:initComponents

    private void jRadioButton26ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton26ActionPerformed
        // tftp receive a file:
        udpRemoteServer = udpRemoteServerField.getText();
        if(udpRemoteServer == null || udpRemoteServer.length() == 0) {
            showError("Please enter a remote server");
            return;
        }
        
        // get the name of the file to receive
        udpStartButton.doClick();
        
        singleValueLabel.setText("Enter file path (TFTP-Receive):");
        showDialog(singleValueDialog);
    }//GEN-LAST:event_jRadioButton26ActionPerformed

    private void jRadioButton25ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton25ActionPerformed
        // tftp send a file:
        udpRemoteServer = udpRemoteServerField.getText();
        if(udpRemoteServer == null || udpRemoteServer.length() == 0) {
            showError("Please enter a remote server");
            return;
        }
        
        // get the name of the file to send
        udpStartButton.doClick();
        
        singleValueLabel.setText("Enter file path (TFTP-Send):");
        showDialog(singleValueDialog);
    }//GEN-LAST:event_jRadioButton25ActionPerformed

    private void udpStartButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_udpStartButtonActionPerformed
        // handler for Start button for UDP:
        if(started) { // means a session has already started
            try{
                handleUDPStop();
            }catch(IOException ex) {
                showError(ex.getMessage());
            }
            return;
        }
        
        udpRemoteServer = udpRemoteServerField.getText();
        
        if(udpRemoteServer == null || udpRemoteServer.length() == 0) {
            showError("Please enter a remote server");
            return;
        }

        try{
            udpClient = 
              ClientFactory.getUDPClientInstance(
                  udpSelectionBox.getSelectedIndex());
            udpClient.open();
        }catch(SocketException se){
            showError(se.getMessage());
            return;
        }catch(IOException ioex){
            showError(ioex.getMessage());
            return;
        }
        
        // if we come here means we have opened a port
        started = true;
        udpStartButton.setText("Stop");
        udpSelectionBox.setEnabled(false);
        jTabbedPane1.setEnabledAt(0, false);
        
        try {
            ProtocolHandler.handleUDPProtocol(
                udpSelectionBox.getSelectedIndex(), 
                udpClient, 
                this);
        }catch (IOException io) {
            showError(io.getMessage());
            io.printStackTrace();
        }        
        
        
    }//GEN-LAST:event_udpStartButtonActionPerformed

    private void jRadioButton9ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton9ActionPerformed
        // reset for pop3:
        if(!checkValidConnection()) return;
        try {
            ((POP3Client)tcpClient).reset();
            tcpServerResponse.append(
                ((POP3Client)tcpClient).getReplyString() + 
                "\r\n");
        }catch(IOException ioex) { showError(ioex.getMessage()); return; }        
    }//GEN-LAST:event_jRadioButton9ActionPerformed

    private void jRadioButton24ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton24ActionPerformed
        // delete message for pop3:
        if(!checkValidConnection()) return;
        
        singleValueLabel.setText("Enter message number to delete:");
        showDialog(singleValueDialog);
    }//GEN-LAST:event_jRadioButton24ActionPerformed

    private void jRadioButton23ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton23ActionPerformed
        // Retrieve message for pop3:
        if(!checkValidConnection()) return;
        
        singleValueLabel.setText("Enter message number:");
        showDialog(singleValueDialog);
    }//GEN-LAST:event_jRadioButton23ActionPerformed

    private void jRadioButton21ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton21ActionPerformed
        // list all messages for pop3:
        if(!checkValidConnection()) return;
        try {
            ((POP3Client)tcpClient).listMessages();
            tcpServerResponse.append(
                ((POP3Client)tcpClient).getReplyString() + 
                "\r\n");
        }catch(IOException ioex) { showError(ioex.getMessage()); return; }        
    }//GEN-LAST:event_jRadioButton21ActionPerformed

    private void jRadioButton22ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton22ActionPerformed
        // status for pop3:
        if(!checkValidConnection()) return;
        try {
            ((POP3Client)tcpClient).status();
            tcpServerResponse.append(
                ((POP3Client)tcpClient).getReplyString() +
                "\r\n");
        }catch(IOException ioex) { showError(ioex.getMessage()); return; }        
    }//GEN-LAST:event_jRadioButton22ActionPerformed

    private void jRadioButton20ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton20ActionPerformed
        // logout for pop3:
        if(!checkValidConnection()) return;
        try {
            ((POP3Client)tcpClient).logout();
            tcpServerResponse.append(
                ((POP3Client)tcpClient).getReplyString() +
                "\r\n");
            handleDisconnect();
        }catch(IOException ioex) { showError(ioex.getMessage()); return; }
    }//GEN-LAST:event_jRadioButton20ActionPerformed

    private void jRadioButton19ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton19ActionPerformed
        // login for pop3:
        if(!checkValidConnection()) return; 
        showDialog(loginDialog);
    }//GEN-LAST:event_jRadioButton19ActionPerformed

    private void jRadioButton16ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton16ActionPerformed
        // Send simple message for SMTP:
        if(!checkValidConnection()) return;
        
        variableLabel.setText("To:");
        showDialog(multipleValueDialog);
    }//GEN-LAST:event_jRadioButton16ActionPerformed

    private void jRadioButton18ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton18ActionPerformed
        // logout for SMTP:
        if(!checkValidConnection()) return;
        
        try {
            ((SMTPClient)tcpClient).logout();
            tcpServerResponse.append(
                ((SMTPClient)tcpClient).getReplyString() +
                "\r\n");
        }catch(IOException ioex) { showError(ioex.getMessage()); return; }         
    }//GEN-LAST:event_jRadioButton18ActionPerformed

    private void jRadioButton17ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton17ActionPerformed
        // login for SMTP:
        if(!checkValidConnection()) return;
        
        // for SMTP login is simply sending HELO
        try {
            ((SMTPClient)tcpClient).login();
            tcpServerResponse.append(
                ((SMTPClient)tcpClient).getReplyString() +
                "\r\n");
        }catch(IOException ioex) { showError(ioex.getMessage()); return; } 
        
    }//GEN-LAST:event_jRadioButton17ActionPerformed

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton5ActionPerformed
        // ok for multiple value dialog:
        String fromText     = fromField.getText();
        String subjectText  = subjectField.getText();
        String variableText = variableField.getText();
        String messageText  = messageArea.getText();
        
        DotTerminatedMessageWriter writer;
              
        int selection = tcpSelectionBox.getSelectedIndex();
        try{
            if(selection == 5) { // means handling NNTP posting of message
                writer = (DotTerminatedMessageWriter)
                    ((NNTPClient)tcpClient).postArticle();             
                
                if(writer == null) { 
                    tcpServerResponse.append(
                        ((NNTPClient)tcpClient).getReplyString() + "\r\n");
                    return;
                }
                
                // create simple NNTP headers
                SimpleNNTPHeader headers = 
                    new SimpleNNTPHeader(fromText, subjectText);
                headers.addNewsgroup(variableText);
                
                // and write the message on
                writer.write(headers.toString());
                writer.write(messageText);
                writer.close();
                ((NNTPClient)tcpClient).completePendingCommand();                
                tcpServerResponse.append(
                    ((NNTPClient)tcpClient).getReplyString() + "\r\n");                
            } else if(selection == 7) { // means handling SMTP posting of message
                
                ((SMTPClient)tcpClient).setSender(fromText);
                ((SMTPClient)tcpClient).addRecipient(variableText);

                writer = (DotTerminatedMessageWriter) 
                    ((SMTPClient)tcpClient).sendMessageData();                
                
                if(writer == null) {
                    tcpServerResponse.append(
                        ((SMTPClient)tcpClient).getReplyString() + "\r\n");
                    return;
                }
                
                // create Simple SMTP header
                SimpleSMTPHeader headers = 
                    new SimpleSMTPHeader(fromText, variableText, subjectText);
                
                writer.write(headers.toString());
                writer.write(messageText);
                writer.close();
                ((SMTPClient)tcpClient).completePendingCommand();
                tcpServerResponse.append(
                    ((SMTPClient)tcpClient).getReplyString() + "\r\n");                
            }
        }catch(IOException ioex) { showError(ioex.getMessage()); }
        finally{ 
            fromField.setText(""); 
            subjectField.setText(""); 
            variableField.setText(""); 
            messageArea.setText("");
            multipleValueDialog.setVisible(false);
        }
    }//GEN-LAST:event_jButton5ActionPerformed

    private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton6ActionPerformed
        // cancel for multiple value dialog:
        multipleValueDialog.setVisible(false);
    }//GEN-LAST:event_jButton6ActionPerformed

    private void jRadioButton13ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton13ActionPerformed
        // post article for nntp:
        if(!checkValidConnection()) return;
        
        variableLabel.setText("Newsgroup:");
        showDialog(multipleValueDialog);
    }//GEN-LAST:event_jRadioButton13ActionPerformed

    private void jRadioButton14ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton14ActionPerformed
        // get article for nntp:
        if(!checkValidConnection()) return;
        
        singleValueLabel.setText("Enter message id:");
        showDialog(singleValueDialog);
    }//GEN-LAST:event_jRadioButton14ActionPerformed

    private void jRadioButton12ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton12ActionPerformed
        // list new news messages for nntp:
        if(!checkValidConnection()) return;
        
        singleValueLabel.setText("Full or part name of group:");
        showDialog(singleValueDialog);
    }//GEN-LAST:event_jRadioButton12ActionPerformed

    private void jRadioButton15ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton15ActionPerformed
        // logout for nntp:
        if(!checkValidConnection()) return;
        
        try {
            ((NNTPClient)tcpClient).logout();
            tcpServerResponse.append(
                ((NNTPClient)tcpClient).getReplyString() + "\r\n");
            handleDisconnect();            
        }catch(IOException ioex) { showError(ioex.getMessage()); }
    }//GEN-LAST:event_jRadioButton15ActionPerformed

    private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton2ActionPerformed
        // list all news groups for nntp:
        if(!checkValidConnection()) return;
        
        try{
            NewsgroupInfo[] newsgroups = 
                ((NNTPClient)tcpClient).listNewsgroups();
            tcpServerResponse.append(
                ((NNTPClient)tcpClient).getReplyString() + "\r\n");
            for(int i=0; i<newsgroups.length; i++) {
                tcpServerResponse.append(newsgroups[i].getNewsgroup() + "\r\n");
            }
        }catch(IOException ioex) { showError(ioex.getMessage()); }        
    }//GEN-LAST:event_jRadioButton2ActionPerformed

    private void jRadioButton11ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton11ActionPerformed
        // list new news group for nntp:
        if(!checkValidConnection()) return;
        
        // create a query to find new news groups since yesterday
        GregorianCalendar today = new GregorianCalendar();    
        today.roll(Calendar.DAY_OF_YEAR, false);
        NewGroupsOrNewsQuery query = 
          new NewGroupsOrNewsQuery(today, false);
        
        try{
            NewsgroupInfo[] newsgroups = 
                ((NNTPClient)tcpClient).listNewNewsgroups(query);
            tcpServerResponse.append(
                ((NNTPClient)tcpClient).getReplyString() + "\r\n");
            
            if(newsgroups == null) return;
            for(int i=0; i<newsgroups.length; i++) {
                tcpServerResponse.append(newsgroups[i].getNewsgroup() + "\r\n");                
            }
            if(newsgroups.length == 0)
                tcpServerResponse.append("No new NewsGroups\r\n");            
        }catch(IOException ioex) { showError(ioex.getMessage()); }      
        
    }//GEN-LAST:event_jRadioButton11ActionPerformed

    private void jRadioButton10ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton10ActionPerformed
        // login for nntp:
        if(!checkValidConnection()) return; 
        showDialog(loginDialog);
    }//GEN-LAST:event_jRadioButton10ActionPerformed

    private void jRadioButton7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton7ActionPerformed
        // Download file for FTP:
        if(!checkValidConnection()) return;
        
        singleValueLabel.setText("Remote file:");
        showDialog(singleValueDialog);
    }//GEN-LAST:event_jRadioButton7ActionPerformed

    private void jRadioButton6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton6ActionPerformed
        // upload file for FTP:
        if(!checkValidConnection()) return;
        
        singleValueLabel.setText("Full path to local file:");
        showDialog(singleValueDialog);
    }//GEN-LAST:event_jRadioButton6ActionPerformed

    private void jRadioButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton5ActionPerformed
        // make directory for FTP:
        if(!checkValidConnection()) return;
        
        singleValueLabel.setText("New Directory Name:");
        showDialog(singleValueDialog);
    }//GEN-LAST:event_jRadioButton5ActionPerformed

    private void jRadioButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton3ActionPerformed
        // list files for FTP:
        if(!checkValidConnection()) return;
        
        try {
            FTPFile[] fileList = ((FTPClient)tcpClient).listFiles();
            tcpServerResponse.append(
                ((FTPClient)tcpClient).getReplyString() + "\r\n");
            if(fileList == null) return;
            for(int i=0; i<fileList.length; i++) {
              tcpServerResponse.append(fileList[i].toString() + "\r\n");
            }
        }catch(IOException ioex) { showError(ioex.getMessage()); return; }
    }//GEN-LAST:event_jRadioButton3ActionPerformed

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
        // Single Value Dialog OK Button
        
        // this method only handles tcp protocols, for udp protocols, another
        // method is used
        if(jTabbedPane1.getSelectedIndex() == 1) { // means we are in udp tab
            udpSingleValOKButton(); 
            return;
        }
        
        String valueText = singleValueField.getText();
        String valueLabel = singleValueLabel.getText();
        int selection = tcpSelectionBox.getSelectedIndex();
        try{
            if(selection == 4) { // means handling FTP
                if("New Directory:".equals(valueLabel)) { 
                    // means CWD
                    ((FTPClient)tcpClient).changeWorkingDirectory(valueText);
                } else if(
                    "New Directory Name:".equals(valueLabel)) {
                        // means make new directory
                        ((FTPClient)tcpClient).makeDirectory(valueText);
                } else if(
                    "Full path to local file:".equals(
                        valueLabel)) { 
                            // means uploading file
                            FileInputStream input = 
                                new FileInputStream(valueText);
                            ((FTPClient)tcpClient).storeFile(
                                new File(valueText).getName(), input);
                            input.close();
                } else if("Remote file:".equals(valueLabel)) { 
                    // means downloading a file
                    FileOutputStream output = 
                        new FileOutputStream(
                            System.getProperty("user.dir") + 
                            System.getProperty("file.separator") + 
                            valueText);
                    ((FTPClient)tcpClient).retrieveFile(valueText, output);
                    output.close();
                }
                tcpServerResponse.append(
                    ((FTPClient)tcpClient).getReplyString() + "\r\n");
            } else if(selection == 5) { // means handling NNTP
                if("Full or part name of group:".equals(valueLabel)) {
                    // means getting new news of a group
                    
                    // create a query to get all new messages in this group
                    // since yesterday
                    GregorianCalendar today = new GregorianCalendar();    
                    today.roll(Calendar.DAY_OF_YEAR, false);
                    NewGroupsOrNewsQuery query = 
                      new NewGroupsOrNewsQuery(today, false);
                    query.addDistribution(valueText);
                    
                    String[] result = 
                        ((NNTPClient)tcpClient).listNewNews(query);
                    
                    tcpServerResponse.append(
                        ((NNTPClient)tcpClient).getReplyString() + "\r\n");
                    
                    // in case the NEWNEWS cmmand is disabled
                    if(result == null)  return;

                    for(int i=0; i<result.length; i++) {
                        tcpServerResponse.append(
                            result[i] + "\r\n");
                    }
                } else if("Enter message id:".equals(valueLabel)) {
                    // means getting a message based on id
                    DotTerminatedMessageReader reader = 
                        (DotTerminatedMessageReader)
                        ((NNTPClient)tcpClient).retrieveArticle(
                        "<" + valueText + ">");
                    tcpServerResponse.append(
                        ((NNTPClient)tcpClient).getReplyString() + "\r\n");                    
                    
                    if(reader == null) return;
                    
                    BufferedReader buffReader = new BufferedReader(reader);
                    String lineRead;
                    while((lineRead = buffReader.readLine()) != null) {
                        tcpServerResponse.append(lineRead + "\r\n");
                    }
                }
            } else if(selection == 6) { // means handling pop3
                if("Enter message number:".equals(valueLabel)) { 
                    // means getting a message based on number
                    DotTerminatedMessageReader reader = 
                        (DotTerminatedMessageReader)                    
                        ((POP3Client)tcpClient).retrieveMessage(
                            Integer.parseInt(valueText));
                    
                    tcpServerResponse.append(
                        ((POP3Client)tcpClient).getReplyString() + 
                        "\r\n");
                    
                    if(reader == null) return;
                    
                    BufferedReader buffReader = new BufferedReader(reader);
                    String lineRead;
                    while((lineRead = buffReader.readLine()) != null) {
                        tcpServerResponse.append(lineRead + "\r\n");
                    }                    
                } else if("Enter message number to delete:".equals(valueLabel)){
                    // means deleting a message based on id
                    ((POP3Client)tcpClient).deleteMessage(
                        Integer.parseInt(valueText));
                    tcpServerResponse.append(
                        ((POP3Client)tcpClient).getReplyString() + 
                        "\r\n");                    
                }
            } else if(selection == 2) { // is echo
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(
                        ((EchoTCPClient)tcpClient).getInputStream()));
                
                PrintWriter writer =
                    new PrintWriter(
                        new OutputStreamWriter(
                            ((EchoTCPClient)tcpClient).getOutputStream()), true);
                
                // write to the server
                writer.println(valueText);
                
                // read from the server
                tcpServerResponse.append(reader.readLine());
                
                // streams are not closed here as there is no provision for the
                // user to send another stream of data. Thus the user has to
                // close the connection, which cleans up open streams.
            } else if(selection == 3) { // is finger
                tcpServerResponse.setText(
                    ((FingerClient)tcpClient).query(false, valueText));
            } else if(selection == 9) { // is whois
                tcpServerResponse.setText(
                    ((WhoisClient)tcpClient).query(valueText));
            }
        }catch(IOException ioex) { showError(ioex.getMessage()); return; }
        finally {
            singleValueField.setText("");
            singleValueDialog.setVisible(false);
        }
    }//GEN-LAST:event_jButton3ActionPerformed

    private void udpSingleValOKButton() {
        // handles udp single value ok button clicks
        String valueText = singleValueField.getText();
        String valueLabel = singleValueLabel.getText();
        
        int selection = udpSelectionBox.getSelectedIndex();
        try{
            if(selection == 2) { // means handling echo
                if("Enter echo data (UDP):".equals(valueLabel)) { 
                    ((EchoUDPClient)udpClient).send(
                        valueText.getBytes(), 
                        InetAddress.getByName(udpRemoteServer));
                    byte[] data = new byte[valueText.length()];
                    
                    ((EchoUDPClient)udpClient).receive(data);
                    udpServerResponse.append(new String(data) + "\r\n");
                }
            } else if(selection == 3) { // handling tftp
                File localFile = new File(valueText);
                if("Enter file path (TFTP-Receive):".equals(valueLabel)) {
                    // means receiving a file via tftp
                    FileOutputStream output = new FileOutputStream(localFile);
                    ((TFTPClient)udpClient).receiveFile(
                        localFile.getName(),
                        TFTPClient.ASCII_MODE,
                        output,
                        InetAddress.getByName(udpRemoteServer));
                    output.close();
                } else if("Enter file path (TFTP-Send):".equals(valueLabel)) {
                    // means sending a file via tftp
                    FileInputStream input = new FileInputStream(localFile);
                    ((TFTPClient)udpClient).sendFile(
                        localFile.getName(),
                        TFTPClient.ASCII_MODE,
                        input,
                        InetAddress.getByName(udpRemoteServer));
                    input.close();
                }
                udpClient.close();
            }
        }catch(IOException ioex) { showError(ioex.getMessage()); return; }
        finally {
            singleValueField.setText("");
            singleValueDialog.setVisible(false);
        }
    }
    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed
        singleValueDialog.setVisible(false);
        
        // if this is any of the following protocols disconnect as well
        int currentSel = tcpSelectionBox.getSelectedIndex();
        int currentUDPSel = udpSelectionBox.getSelectedIndex();
        int currentSelTab = jTabbedPane1.getSelectedIndex();
        try{
            if((currentSel == 2) && (currentSelTab == 0)) { 
                // is Echo for TCP
                handleDisconnect();
            } else if((currentUDPSel == 3) && (currentSelTab == 1)) { 
                // is TFTP for UDP
                handleUDPStop();
            }
        }catch(IOException ioex) {
            System.err.println(ioex.getMessage());
        }
    }//GEN-LAST:event_jButton4ActionPerformed

    private void jRadioButton8ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton8ActionPerformed
        // logout for ftp:
        if(!checkValidConnection()) return;
        try{
            ((FTPClient)tcpClient).logout();
            tcpServerResponse.append(((FTPClient)tcpClient).getReplyString());
            handleDisconnect();
        }catch(IOException ioex) { showError(ioex.getMessage()); }
    }//GEN-LAST:event_jRadioButton8ActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // login handling code for ftp, nntp, pop3:
        String username = loginUsername.getText();
        String password = loginPassword.getText();

        loginDialog.setVisible(false);
        try {
            int currentSel = tcpSelectionBox.getSelectedIndex();
            if(currentSel == 4) { // is FTP login
                ((FTPClient)tcpClient).login(username, password);
                tcpServerResponse.append(
                    ((FTPClient)tcpClient).getReplyString());
            } else if(currentSel == 5) { // is NNTP login
                ((NNTPClient)tcpClient).authenticate(username, password);
                tcpServerResponse.append(
                    ((NNTPClient)tcpClient).getReplyString());
            } else if(currentSel == 6) { // is POP3 login
                ((POP3Client)tcpClient).login(username, password);
                tcpServerResponse.append(
                    ((POP3Client)tcpClient).getReplyString());
            }
        }catch(IOException ioex) { showError(ioex.getMessage()); }
        finally{ loginUsername.setText(""); loginPassword.setText(""); }
    }//GEN-LAST:event_jButton1ActionPerformed

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        // Add your handling code here:
        loginDialog.setVisible(false);
    }//GEN-LAST:event_jButton2ActionPerformed

    private void jRadioButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton4ActionPerformed
        // ftp login
        if(!checkValidConnection()) return; 
        showDialog(loginDialog);
    }//GEN-LAST:event_jRadioButton4ActionPerformed

    private boolean checkValidConnection() {
        if(!connected) { showError("Please connect first!"); return false; }
        return true;
    }
    
    private void commandBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_commandBoxActionPerformed
        
        String commandString = commandBox.getText();
        if(commandString == null || commandString.length() == 0) return;
        try{
            ProtocolHandler.handleTCPProtocol(
                tcpSelectionBox.getSelectedIndex(), 
                tcpClient, this, commandString);
        }catch(IOException ioex) { showError(ioex.getMessage()); }
        finally{ commandBox.setText(""); }
    }//GEN-LAST:event_commandBoxActionPerformed

    /**
     * This code handles the action events for the Connect button 
     */
    private void tcpConnectButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tcpConnectButtonActionPerformed

        // if already connected, simply disconnect
        if(connected) {
            try {
                handleDisconnect();
            }catch(IOException e) {
                showError(e.getMessage());
            }
            return;
        }
        
        // if not connected, try and make a connection        
        String server  = serverNameField.getText();
        String port    = portNumberField.getText();
        int portNumber;
        
        // check if the port number is a valid number
        try{
          portNumber = Integer.parseInt(port);
        }catch(NumberFormatException nfe){
            showError("Invalid port number: " + port);
            return;
        }
        
        // some basic checking of data
        if(server == null || server.trim().length() == 0 ||
           portNumber < 1){
          showError("Invalid connection attributes");
          return;
        }
        
        // now using the factory create an instance of the client
        // and connect
        try{
            tcpClient = 
              ClientFactory.getTCPClientInstance(
                  tcpSelectionBox.getSelectedIndex());
            tcpClient.connect(server, portNumber);
        }catch(SocketException se){
            showError(se.getMessage());
            return;
        }catch(IOException ioex){
            showError(ioex.getMessage());
            return;
        }
        
        // if we come here means we have connected
        connected = true;
        tcpConnectButton.setText("Disconnect");
        tcpSelectionBox.setEnabled(false);
        jTabbedPane1.setEnabledAt(1, false);
        
        try {
            ProtocolHandler.handleTCPProtocol(
                tcpSelectionBox.getSelectedIndex(), 
                tcpClient, 
                this);
        }catch (IOException io) {
            showError(io.getMessage());
            io.printStackTrace();
        }

    }//GEN-LAST:event_tcpConnectButtonActionPerformed

    private void udpSelectionBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_udpSelectionBoxActionPerformed
        // Add your handling code here:
        JComboBox box = (JComboBox)evt.getSource();
        int selectedProtocolIdx = box.getSelectedIndex();
        
        udpCommandPanel.removeAll();
        
        if(selectedProtocolIdx == 3){ // is TFTP
            udpCommandPanel.add(tftpPanel);
        }else{
            udpCommandPanel.add(udpStartButton);
        }
        
        repaint(); 
    }//GEN-LAST:event_udpSelectionBoxActionPerformed

    private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton1ActionPerformed
        // change working directory for FTP
        if(!checkValidConnection()) return;
        
        singleValueLabel.setText("New Directory:");
        showDialog(singleValueDialog);
    }//GEN-LAST:event_jRadioButton1ActionPerformed

    private void tcpSelectionBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tcpSelectionBoxActionPerformed
        // Add your handling code here:
        // get the protocol selected
        JComboBox box = (JComboBox)evt.getSource();
        int selectedProtocolIdx = box.getSelectedIndex();
        updateTCPPanels(selectedProtocolIdx);
    }//GEN-LAST:event_tcpSelectionBoxActionPerformed
    
    private void updateTCPPanels(int index){        
        // based on what protocol has been selected,
        // change the available commands panel
        presetPanel.removeAll();
        
        // this local boolean indicates if the protocol currently being
        // used requires a different command panel or not
        boolean isPanelDifferent = false;
        
        switch(index){
            case 4: {
                presetPanel.add(ftpPanel);
                isPanelDifferent = true;
                portNumberField.setText("21");
                break;
            }// ftp
            case 5: {
                presetPanel.add(nntpPanel);
                isPanelDifferent = true;
                portNumberField.setText("119");
                break;
            } // nntp
            case 6: {
                presetPanel.add(pop3Panel);
                isPanelDifferent = true;
                portNumberField.setText("110");
                break;
            }
            case 7: {
                presetPanel.add(smtpPanel);
                isPanelDifferent = true;
                portNumberField.setText("25");
                break;
            } // smtp
            case 0: {
                portNumberField.setText("19");
                break;
            } // chargen
            case 1: {
                portNumberField.setText("13");
                break;
            } // daytime
            case 2: {
                portNumberField.setText("7");                
                break;
            } // echo
            case 3: {
                portNumberField.setText("79");
                break;
            } // finger
            case 8: {
                portNumberField.setText("37");
                break;
            } // time
            case 9: {
                portNumberField.setText("43");
                break;
            } // Whois
        }
        
        if(isPanelDifferent) {
            commandBox.setEnabled(true);
        } else {
            commandBox.setEnabled(false);
            presetPanel.add(defaultPanel);
        }
        
        repaint();
    }
    
    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
        System.exit(0);
    }//GEN-LAST:event_exitForm
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        new ProtocolRunner().show();
    }
    
    private void showError(String msg){
        JOptionPane.showMessageDialog(
          this, msg, "Error", JOptionPane.ERROR_MESSAGE);
        try {
            if(connected) handleDisconnect();
        }catch(IOException ioex) { System.err.println(ioex.getMessage()); }
    }
    
    void showDialog(JDialog dialog) {
        dialog.pack();
        dialog.setLocationRelativeTo(this);
        dialog.setVisible(true);
    }
    
    final void handleUDPStop() throws IOException {
        udpClient.close();
        started = false;
        udpServerResponse.setText("");
        udpStartButton.setText("Start");
        udpSelectionBox.setEnabled(true);
        jTabbedPane1.setEnabledAt(0, true);
        return;
    }
    
    final void handleDisconnect() throws IOException {
        tcpClient.disconnect();
        tcpServerResponse.setText("");
        connected = false;
        tcpConnectButton.setText("Connect");
        tcpSelectionBox.setEnabled(true);
        jTabbedPane1.setEnabledAt(1, true);
        return;
    }
    
    final JTextArea getTCPServerResponse() {
        return this.tcpServerResponse;
    }

    final JTextArea getUDPServerResponse() {
        return this.udpServerResponse;
    }
    
    final JDialog getSingleValueDialog() {
        return this.singleValueDialog;
    }

    final JLabel getSingleValueLabel() {
        return this.singleValueLabel;
    }    
    
    final JTextField getSingleValueText() {
        return this.singleValueField;
    }

    final String getUDPRemoteServer() {
        return this.udpRemoteServer;
    }
    
    // non GUI variables
    // identifies if a connection is made for tcp
    private boolean connected;
    
    // identifies if a udp session is started
    private boolean started;   
    
    // the remote udp server
    private String udpRemoteServer;
    
    // the current client for tcp connections
    SocketClient tcpClient;
    
    // the current client for udp connections
    DatagramSocketClient udpClient;
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextField commandBox;
    private javax.swing.JPanel defaultPanel;
    private javax.swing.JTextField fromField;
    private javax.swing.ButtonGroup ftpButtonGroup;
    private javax.swing.JPanel ftpPanel;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    private javax.swing.JButton jButton6;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel10;
    private javax.swing.JPanel jPanel11;
    private javax.swing.JPanel jPanel12;
    private javax.swing.JPanel jPanel13;
    private javax.swing.JPanel jPanel14;
    private javax.swing.JPanel jPanel15;
    private javax.swing.JPanel jPanel16;
    private javax.swing.JPanel jPanel17;
    private javax.swing.JPanel jPanel18;
    private javax.swing.JPanel jPanel19;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JPanel jPanel8;
    private javax.swing.JPanel jPanel9;
    private javax.swing.JRadioButton jRadioButton1;
    private javax.swing.JRadioButton jRadioButton10;
    private javax.swing.JRadioButton jRadioButton11;
    private javax.swing.JRadioButton jRadioButton12;
    private javax.swing.JRadioButton jRadioButton13;
    private javax.swing.JRadioButton jRadioButton14;
    private javax.swing.JRadioButton jRadioButton15;
    private javax.swing.JRadioButton jRadioButton16;
    private javax.swing.JRadioButton jRadioButton17;
    private javax.swing.JRadioButton jRadioButton18;
    private javax.swing.JRadioButton jRadioButton19;
    private javax.swing.JRadioButton jRadioButton2;
    private javax.swing.JRadioButton jRadioButton20;
    private javax.swing.JRadioButton jRadioButton21;
    private javax.swing.JRadioButton jRadioButton22;
    private javax.swing.JRadioButton jRadioButton23;
    private javax.swing.JRadioButton jRadioButton24;
    private javax.swing.JRadioButton jRadioButton25;
    private javax.swing.JRadioButton jRadioButton26;
    private javax.swing.JRadioButton jRadioButton3;
    private javax.swing.JRadioButton jRadioButton4;
    private javax.swing.JRadioButton jRadioButton5;
    private javax.swing.JRadioButton jRadioButton6;
    private javax.swing.JRadioButton jRadioButton7;
    private javax.swing.JRadioButton jRadioButton8;
    private javax.swing.JRadioButton jRadioButton9;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JDialog loginDialog;
    private javax.swing.JPasswordField loginPassword;
    private javax.swing.JTextField loginUsername;
    private javax.swing.JTextArea messageArea;
    private javax.swing.JDialog multipleValueDialog;
    private javax.swing.ButtonGroup nntpButtonGroup;
    private javax.swing.JPanel nntpPanel;
    private javax.swing.ButtonGroup pop3ButtonGroup;
    private javax.swing.JPanel pop3Panel;
    private javax.swing.JTextField portNumberField;
    private javax.swing.JPanel presetPanel;
    private javax.swing.JTextField serverNameField;
    private javax.swing.JDialog singleValueDialog;
    private javax.swing.JTextField singleValueField;
    private javax.swing.JLabel singleValueLabel;
    private javax.swing.ButtonGroup smtpButtonGroup;
    private javax.swing.JPanel smtpPanel;
    private javax.swing.JTextField subjectField;
    private javax.swing.JButton tcpConnectButton;
    private javax.swing.JComboBox tcpSelectionBox;
    private javax.swing.JTextArea tcpServerResponse;
    private javax.swing.JPanel tftpPanel;
    private javax.swing.ButtonGroup tftpPanelButtonGroup;
    private javax.swing.JPanel udpCommandPanel;
    private javax.swing.JTextField udpRemoteServerField;
    private javax.swing.JComboBox udpSelectionBox;
    private javax.swing.JTextArea udpServerResponse;
    private javax.swing.JButton udpStartButton;
    private javax.swing.JTextField variableField;
    private javax.swing.JLabel variableLabel;
    // End of variables declaration//GEN-END:variables
    
}------------------------------------------------------------------

    /*
     * ClientFactory.java
     *
     * Created on December 31, 2003, 12:15 PM
     */

import org.apache.commons.net.*;
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.smtp.SMTPClient;
    import org.apache.commons.net.pop3.POP3Client;
    import org.apache.commons.net.nntp.NNTPClient;
    import org.apache.commons.net.tftp.TFTPClient;

/**
 * Factory for creation of singleton clients.
 * @author  vgoyal
 */
class ClientFactory {
    
    public static SocketClient getTCPClientInstance(int clientType) {
       switch(clientType) {
            case 0: { // is chargen
                if(charGenTCPClient == null) {
                    charGenTCPClient = new CharGenTCPClient();
                }
                return charGenTCPClient;
            }
           case 1: { // is daytime 
               if(daytimeTCPClient == null) {
                   daytimeTCPClient = new DaytimeTCPClient();
               }
               return daytimeTCPClient;
           }
           case 2: { // is echo
               if(echoTCPClient == null) {
                   echoTCPClient = new EchoTCPClient();
               }
               return echoTCPClient;
           }
           case 3: { // is finger
               if(fingerClient == null) {
                   fingerClient = new FingerClient();
               }
               return fingerClient;
           }
           case 4: { // is ftp
               if(ftpClient == null) {
                   ftpClient = new FTPClient();
               }
               return ftpClient;
           }
           case 5: { // is nntp
               if(nntpClient == null) {
                   nntpClient = new NNTPClient();
               }
               return nntpClient;
           }
           case 6: { // is pop3
               if(pop3Client == null) {
                   pop3Client = new POP3Client();
               }
               return pop3Client;
           }
           case 7: { // is smtp
               if(smtpClient == null) {
                   smtpClient = new SMTPClient();
               }
               return smtpClient;
           }
           case 8: { // is time
               if(timeTCPClient == null) {
                   timeTCPClient = new TimeTCPClient();
               }
               return timeTCPClient;
           }
           case 9: { // is whois
               if(whoisClient == null) {
                   whoisClient = new WhoisClient();
               }
               return whoisClient;
           }
        }
        return null;
    }
    
    public static DatagramSocketClient getUDPClientInstance(int clientType) {
       switch(clientType) {
            case 0: { // is chargen
                if(charGenUDPClient == null) {
                    charGenUDPClient = new CharGenUDPClient();
                }
                return charGenUDPClient;
            }
           case 1: { // is daytime
               if(daytimeUDPClient == null) {
                   daytimeUDPClient = new DaytimeUDPClient();
               }
               return daytimeUDPClient;
           }
           case 2: { // is echo
               if(echoUDPClient == null) {
                   echoUDPClient = new EchoUDPClient();
               }
               return echoUDPClient;
           }
           case 3: { // is tftp
               if(tftpClient == null) {
                   tftpClient = new TFTPClient();
               }
               return tftpClient;
           }
           case 4: { // is time
               if(timeUDPClient == null) {
                   timeUDPClient = new TimeUDPClient();
               }
               return timeUDPClient;
           }
        }
       return null;
    }
    
    // TCP clients
    private static CharGenTCPClient charGenTCPClient;
    private static DaytimeTCPClient daytimeTCPClient;
    private static EchoTCPClient    echoTCPClient;
    private static FingerClient     fingerClient;
    private static FTPClient        ftpClient;
    private static NNTPClient       nntpClient;
    private static POP3Client       pop3Client;
    private static SMTPClient       smtpClient;
    private static TimeTCPClient    timeTCPClient;
    private static WhoisClient      whoisClient;
    
    // UDP clients
    private static CharGenUDPClient charGenUDPClient;
    private static DaytimeUDPClient daytimeUDPClient;
    private static EchoUDPClient    echoUDPClient;
    private static TFTPClient       tftpClient;
    private static TimeUDPClient    timeUDPClient;
}

    -----------------------------------------------------------
    /*
     * ProtocolHandler.java
     *
     * Created on December 28, 2003, 1:05 PM
     */

import org.apache.commons.net.*;
import org.apache.commons.net.ftp.*;
import org.apache.commons.net.nntp.*;
import org.apache.commons.net.pop3.*;
import org.apache.commons.net.smtp.*;
import org.apache.commons.net.tftp.*;

    import java.util.Date;
    import java.io.InputStream;
    import java.io.IOException;
    import java.net.InetAddress;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;

/**
 * This class handles protocol commands that are either typed in or do not 
 * require much manual intervention.
 * @author  vgoyal
 */
public class ProtocolHandler {
    
    public static void handleTCPProtocol(
        int protocolId, SocketClient client, 
        ProtocolRunner runner, String commandString) 
        throws IOException {
        
        switch(protocolId) {
            case 0: { // is chargen
                handleTCPChargen((CharGenTCPClient)client, runner);
                return;
            }
            case 1: { // is daytime
                handleTCPDaytime((DaytimeTCPClient)client, runner);
                return;
            }
            case 2: { // is echo
                handleTCPEcho((EchoTCPClient)client, runner);
                return;
            }  
            case 3: { // is finger
                handleFinger((FingerClient)client, runner);
                return;
            }              
            case 4: { // is ftp
                handleFTP((FTPClient)client, runner, commandString);
                return;
            }
            case 5: { // is nntp
                handleNNTP((NNTPClient)client, runner, commandString);
                return;
            }
            case 6: { // is pop3
                handlePOP3((POP3Client)client, runner, commandString);
                return;
            }
            case 7: { // is smtp
                handleSMTP((SMTPClient)client, runner, commandString);
                return;
            }
            case 8: { // is Time
                handleTCPTime((TimeTCPClient)client, runner);
                return;
            }
            case 9: { // is Whois
                handleWhois((WhoisClient)client, runner);
                return;
            }
        }
    }    

    public static void handleTCPProtocol(
        int protocolId, SocketClient client, ProtocolRunner runner)  
        throws IOException {
            handleTCPProtocol(protocolId, client, runner, null);
    }

    
    public static void handleUDPProtocol(
        int protocolId, DatagramSocketClient client, ProtocolRunner runner)
        throws IOException {

        switch(protocolId) {
            case 0: { // is chargen
                handleUDPChargen((CharGenUDPClient)client, runner);
                return;
            }
            case 1: { // is daytime
                handleUDPDaytime((DaytimeUDPClient)client, runner);
                return;
            }
            case 2: { // is echo
                handleUDPEcho((EchoUDPClient)client, runner);
                return;
            }
            case 4: { // is time
                handleUDPTime((TimeUDPClient)client, runner);
                return;
            }
        }            
    }    
    
    private static void handleUDPChargen(
        CharGenUDPClient client, ProtocolRunner runner) 
        throws IOException {
            
        int packets = 500;        
        while(packets-- > 0) {
            client.send(InetAddress.getByName(runner.getUDPRemoteServer()));
            runner.getUDPServerResponse().append(new String(client.receive()));
        }
    }

    private static void handleUDPDaytime(
        DaytimeUDPClient client, ProtocolRunner runner) 
        throws IOException {            
            runner.getUDPServerResponse().append(
                client.getTime(
                    InetAddress.getByName(runner.getUDPRemoteServer())) 
                    + "\r\n");
    }

    private static void handleUDPEcho(
        EchoUDPClient client, ProtocolRunner runner) 
        throws IOException {
            
        // use the runner to get data from the user to send to echo server
        runner.getSingleValueLabel().setText("Enter echo data (UDP):");
        runner.showDialog(runner.getSingleValueDialog());
    }        
    
    private static void handleUDPTime(
        TimeUDPClient client, ProtocolRunner runner) 
        throws IOException {
            
        long origTime = client.getTime(InetAddress.getByName(
            runner.getUDPRemoteServer()));

        runner.getUDPServerResponse().append(
        "Time returned from server: " +  origTime + "\r\n" +
        "Converted to Date: " + 
        new Date(((origTime) - TimeUDPClient.SECONDS_1900_TO_1970)*1000L));
    }    

    private static void handleTCPChargen(
        CharGenTCPClient client, ProtocolRunner runner) 
        throws IOException {

        // simply grab the resulting inputstream to show the return by the
        // remote server for upto 500 lines
        BufferedReader chargenInput = 
            new BufferedReader(new InputStreamReader(client.getInputStream()));
        
        int lines = 500;
        while(lines-- > 0) {
            runner.getTCPServerResponse().append(
                chargenInput.readLine() + "\r\n");
        }
    }
    
    private static void handleTCPDaytime(
        DaytimeTCPClient client, ProtocolRunner runner) 
        throws IOException {            
            runner.getTCPServerResponse().append(client.getTime() + "\r\n");
    }

    private static void handleTCPTime(
        TimeTCPClient client, ProtocolRunner runner) 
        throws IOException {
            long origTime = client.getTime();
            
            // remember that the long time returned from the server is the 
            // seconds since midnight Jan 1900 and Date in Java is number of
            // seconds since midnight Jan 1970. NET TCPClient provides the time
            // in both formats but you cannot call them both one after another
            // as the internal getDate uses getTime, but the line has already
            // been closed if you have called getTime before.
            runner.getTCPServerResponse().append(
            "Time returned from server: " +  origTime + "\r\n" +
            "Converted to Date: " + 
            new Date(((origTime) - TimeTCPClient.SECONDS_1900_TO_1970)*1000L));
    }

    private static void handleTCPEcho(
        EchoTCPClient client, ProtocolRunner runner) 
        throws IOException {
            
        // use the runner to get data from the user to send to echo server
        runner.getSingleValueLabel().setText("Enter echo data:");
        runner.showDialog(runner.getSingleValueDialog());
    }    
    
    private static void handleFinger(
        FingerClient client, ProtocolRunner runner) 
        throws IOException {
            
        // use the runner to get data from the user to send to echo server
        runner.getSingleValueLabel().setText("Enter query:");
        runner.showDialog(runner.getSingleValueDialog());
    }

    private static void handleWhois(
        WhoisClient client, ProtocolRunner runner) 
        throws IOException {
            
        // use the runner to get data from the user to send to echo server
        runner.getSingleValueLabel().setText("Enter Whois query:");
        runner.showDialog(runner.getSingleValueDialog());
    }    
    
    private static void handleFTP(
        FTPClient client, 
        ProtocolRunner runner, 
        String commandString) 
        throws IOException {
        
        if(commandString == null) { // means just connected        
            
            // check if the server response was valid
            if(!FTPReply.isPositiveCompletion(client.getReplyCode())) {
                runner.handleDisconnect();
                return;
            }
            
        } else { // need to handle a command
            client.sendCommand(commandString);
        }
        
        runner.getTCPServerResponse().append(client.getReplyString());
    }

    private static void handleNNTP(
        NNTPClient client, 
        ProtocolRunner runner, 
        String commandString) 
        throws IOException {
        
        if(commandString == null) { // means just connected        
        
            // check if the server response was valid
            if(!NNTPReply.isPositiveCompletion(client.getReplyCode())) {
                runner.handleDisconnect();
                return;
            }
            
        } else { // need to handle a command
            client.sendCommand(commandString);
        }
        
        runner.getTCPServerResponse().append(client.getReplyString());
    }

    private static void handlePOP3(
        POP3Client client, 
        ProtocolRunner runner, 
        String commandString) 
        throws IOException {
        
        if(commandString == null) { // means just connected 
                return;            
        } else { // need to handle a command
            client.sendCommand(commandString);
        }
        
        runner.getTCPServerResponse().append(client.getReplyString());
    }

    private static void handleSMTP(
        SMTPClient client, 
        ProtocolRunner runner, 
        String commandString) 
        throws IOException {
        
        if(commandString == null) { // means just connected 
            // check if the server response was valid
            if(!SMTPReply.isPositiveCompletion(client.getReplyCode())) {
                runner.handleDisconnect();
                return;
            }
        } else { // need to handle a command
            client.sendCommand(commandString);
        }
        
        runner.getTCPServerResponse().append(client.getReplyString());
    } 
    
}

    public class MultiProtocolHandler {
    }

    /*
     * Command.java
     *
     * Created on December 28, 2003, 3:10 PM
     */

    import java.util.Vector;
    import java.util.Iterator;
    import java.lang.IllegalArgumentException;

    /**
     * A Command is a protocol independent class that implements commands.
     * A Command may have arguments, like USER for FTP, or it may be standalone
     * as in logout, again for ftp. A command can only be created by calling the
     * Command Constructor with the name of the command. To add arguments to the
     * command, use the addArgument method.
     * @author  vgoyal
     */
    public class Command {

        private String commandName;

        private Vector commandArguments;

        /** Creates a new instance of Command */
        public Command(String commandName) {
            if (commandName == null || commandName.length() == 0) {
                throw new IllegalArgumentException("Invalid Command Name");
            }

            this.commandName = commandName;
        }

        public String getCommandName() {
            return this.commandName;
        }

        public void addArgument(String argValue) {
            if (argValue == null || argValue.length() == 0) {
                throw new IllegalArgumentException("Invalid Command Argument");
            }

            if (commandArguments == null)
                commandArguments = new Vector();

            commandArguments.add(argValue);
        }

        public int getCountCommandArguments() {
            if (commandArguments == null)
                return 0;
            else
                return commandArguments.size();
        }

        /**
         * Returns space delimited String containing all arguments to this command
         */
        public String getArguments() {
            if (getCountCommandArguments() == 0)
                return "";

            String returnVal = "";
            Iterator itr = commandArguments.iterator();
            while (itr.hasNext()) {
                returnVal = returnVal + " " + itr.next();
            }

            return returnVal;
        }

    }