1.soap监视器原理:soap监视器通过tcpip协议截获和转发soap请求,并且显示相关的soap封装信息,使开发人员可以轻松的调试web服务,它的原理如下: 
  
2.系统类图: 
  
3.程序源代码:  
package estore.client.util; 
/*  * EStore  *  * Copyright (c) 2003 YL Group.  All rights reserved.  *  */ 
import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.plaf.basic.BasicButtonListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.PlainDocument; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.URL; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.ResourceBundle; import java.util.Vector; 
/**  * TCP monitor to log http messages and responses, both SOAP and plain HTTP.  * @author yellowicq([email protected])  */ 
public class TCPMonitor     extends JFrame {   private JTabbedPane notebook = null; 
  private static final int STATE_COLUMN = 0;   private static final int TIME_COLUMN = 1;   private static final int INHOST_COLUMN = 2;   private static final int OUTHOST_COLUMN = 3;   private static final int REQ_COLUMN = 4; 
  private static final String DEFAULT_HOST = "127.0.0.1";   private static final int DEFAULT_PORT = 8080; 
  /**    * this is the admin page    */   class AdminPage       extends JPanel {     public JRadioButton listenerButton, proxyButton;     public JLabel hostLabel, tportLabel;     public NumberField port;     public HostnameField host;     public NumberField tport;     public JTabbedPane noteb;     public JCheckBox HTTPProxyBox;     public HostnameField HTTPProxyHost;     public NumberField HTTPProxyPort;     public JLabel HTTPProxyHostLabel, HTTPProxyPortLabel;     public JLabel delayTimeLabel, delayBytesLabel;     public NumberField delayTime, delayBytes;     public JCheckBox delayBox; 
    public AdminPage(JTabbedPane notebook, String name) {       JPanel mainPane = null;       JButton addButton = null; 
      this.setLayout(new BorderLayout());       noteb = notebook; 
      GridBagLayout layout = new GridBagLayout();       GridBagConstraints c = new GridBagConstraints(); 
      mainPane = new JPanel(layout); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       mainPane.add(new JLabel(getMessage("newTCP00",                                          "Create a new TCP/IP Monitor...") +                               " "), c); 
      // Add some blank space       mainPane.add(Box.createRigidArea(new Dimension(1, 5)), c); 
      // The listener info       ///////////////////////////////////////////////////////////////       JPanel tmpPanel = new JPanel(new GridBagLayout()); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = 1;       tmpPanel.add(new JLabel(getMessage("listenPort00", "Listen Port #") + " "),                    c); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       tmpPanel.add(port = new NumberField(4), c); 
      mainPane.add(tmpPanel, c); 
      mainPane.add(Box.createRigidArea(new Dimension(1, 5)), c); 
      // Group for the radio buttons       ButtonGroup btns = new ButtonGroup(); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       mainPane.add(new JLabel(getMessage("actAs00", "Act as a...")), c); 
      // Target Host/Port section       ///////////////////////////////////////////////////////////////////       c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER; 
      final String listener = getMessage("listener00", "Listener"); 
      mainPane.add(listenerButton = new JRadioButton(listener), c);       btns.add(listenerButton);       listenerButton.setSelected(true); 
      listenerButton.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent event) {           if (listener.equals(event.getActionCommand())) {             boolean state = listenerButton.isSelected(); 
            tport.setEnabled(state);             host.setEnabled(state);             hostLabel.setForeground(state ? Color.black : Color.gray);             tportLabel.setForeground(state ? Color.black : Color.gray);           }         }       }       ); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = 1;       mainPane.add(Box.createRigidArea(new Dimension(25, 0)));       mainPane.add(hostLabel = new JLabel(getMessage("targetHostname00",           "Target Hostname") + " "), c); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       host = new HostnameField(30);       mainPane.add(host, c);       host.setText(DEFAULT_HOST); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = 1;       mainPane.add(Box.createRigidArea(new Dimension(25, 0)));       mainPane.add(tportLabel = new JLabel(getMessage("targetPort00",           "Target Port #") + " "), c); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       tport = new NumberField(4);       mainPane.add(tport, c);       tport.setValue(DEFAULT_PORT); 
      // Act as proxy section       ///////////////////////////////////////////////////////////////////       c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       final String proxy = getMessage("proxy00", "Proxy"); 
      mainPane.add(proxyButton = new JRadioButton(proxy), c);       btns.add(proxyButton); 
      proxyButton.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent event) {           if (proxy.equals(event.getActionCommand())) {             boolean state = proxyButton.isSelected(); 
            tport.setEnabled(!state);             host.setEnabled(!state);             hostLabel.setForeground(state ? Color.gray : Color.black);             tportLabel.setForeground(state ? Color.gray : Color.black);           }         }       }       ); 
      // Spacer       /////////////////////////////////////////////////////////////////       c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       mainPane.add(Box.createRigidArea(new Dimension(1, 10)), c); 
      // Options section       ///////////////////////////////////////////////////////////////////       JPanel opts = new JPanel(new GridBagLayout()); 
      opts.setBorder(new TitledBorder(getMessage("options00", "Options")));       c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       mainPane.add(opts, c); 
      // HTTP Proxy Support section       ///////////////////////////////////////////////////////////////////       c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       final String proxySupport = getMessage("proxySupport00",                                              "HTTP Proxy Support"); 
      opts.add(HTTPProxyBox = new JCheckBox(proxySupport), c); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = 1;       opts.add(HTTPProxyHostLabel = new JLabel(getMessage("hostname00",           "Hostname") + " "), c);       HTTPProxyHostLabel.setForeground(Color.gray); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       opts.add(HTTPProxyHost = new HostnameField(30), c);       HTTPProxyHost.setEnabled(false); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = 1;       opts.add(HTTPProxyPortLabel = new JLabel(getMessage("port00", "Port #") +                                                " "), c);       HTTPProxyPortLabel.setForeground(Color.gray); 
      c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       opts.add(HTTPProxyPort = new NumberField(4), c);       HTTPProxyPort.setEnabled(false); 
      HTTPProxyBox.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent event) {           if (proxySupport.equals(event.getActionCommand())) {             boolean b = HTTPProxyBox.isSelected();             Color color = b ? Color.black : Color.gray; 
            HTTPProxyHost.setEnabled(b);             HTTPProxyPort.setEnabled(b);             HTTPProxyHostLabel.setForeground(color);             HTTPProxyPortLabel.setForeground(color);           }         }       }       ); 
      // Set default proxy values...       String tmp = System.getProperty("http.proxyHost"); 
      if (tmp != null && tmp.equals("")) {         tmp = null;       } 
      HTTPProxyBox.setSelected(tmp != null);       HTTPProxyHost.setEnabled(tmp != null);       HTTPProxyPort.setEnabled(tmp != null);       HTTPProxyHostLabel.setForeground(tmp != null ? Color.black : Color.gray);       HTTPProxyPortLabel.setForeground(tmp != null ? Color.black : Color.gray); 
      if (tmp != null) {         HTTPProxyBox.setSelected(true);         HTTPProxyHost.setText(tmp);         tmp = System.getProperty("http.proxyPort");         if (tmp != null && tmp.equals("")) {           tmp = null;         }         if (tmp == null) {           tmp = "80";         }         HTTPProxyPort.setText(tmp);       } 
      //add byte delay fields       opts.add(Box.createRigidArea(new Dimension(1, 10)), c);       c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       final String delaySupport = getMessage("delay00",                                              "Simulate Slow Connection");       opts.add(delayBox = new JCheckBox(delaySupport), c); 
      //bytes per pause       c.anchor = GridBagConstraints.WEST;       c.gridwidth = 1;       delayBytesLabel = new JLabel(getMessage("delay01", "Bytes per Pause"));       opts.add(delayBytesLabel, c);       delayBytesLabel.setForeground(Color.gray);       c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       opts.add(delayBytes = new NumberField(6), c);       delayBytes.setEnabled(false); 
      //delay interval       c.anchor = GridBagConstraints.WEST;       c.gridwidth = 1;       delayTimeLabel = new JLabel(getMessage("delay02", "Delay in Milliseconds"));       opts.add(delayTimeLabel, c);       delayTimeLabel.setForeground(Color.gray);       c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       opts.add(delayTime = new NumberField(6), c);       delayTime.setEnabled(false); 
      //enabler callback       delayBox.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent event) {           if (delaySupport.equals(event.getActionCommand())) {             boolean b = delayBox.isSelected();             Color color = b ? Color.black : Color.gray; 
            delayBytes.setEnabled(b);             delayTime.setEnabled(b);             delayBytesLabel.setForeground(color);             delayTimeLabel.setForeground(color);           }         }       }       ); 
      // Spacer       //////////////////////////////////////////////////////////////////       mainPane.add(Box.createRigidArea(new Dimension(1, 10)), c); 
      // ADD Button       ///////////////////////////////////////////////////////////////////       c.anchor = GridBagConstraints.WEST;       c.gridwidth = GridBagConstraints.REMAINDER;       final String add = getMessage("add00", "Add"); 
      mainPane.add(addButton = new JButton(add), c); 
      this.add(new JScrollPane(mainPane), BorderLayout.CENTER); 
      addButton.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent event) {           if (add.equals(event.getActionCommand())) {             String text;             Listener l = null;             int lPort;             lPort = port.getValue(0);             if (lPort == 0) {               //no port, button does nothing               return;             }             String tHost = host.getText();             int tPort = 0;             tPort = tport.getValue(0);             SlowLinkSimulator slowLink = null;             if (delayBox.isSelected()) {               int bytes = delayBytes.getValue(0);               int time = delayTime.getValue(0);               slowLink = new SlowLinkSimulator(bytes, time);             }             l = new Listener(noteb, null, lPort, tHost, tPort,                              proxyButton.isSelected(), slowLink); 
            // Pick-up the HTTP Proxy settings             ///////////////////////////////////////////////////             text = HTTPProxyHost.getText();             if ("".equals(text)) {               text = null;             }             l.HTTPProxyHost = text;             text = HTTPProxyPort.getText();             int proxyPort = HTTPProxyPort.getValue( -1);             if (proxyPort != -1) {               l.HTTPProxyPort = Integer.parseInt(text);             }             //reset the port             port.setText(null);           }         }       }       ); 
      notebook.addTab(name, this);       notebook.repaint();       notebook.setSelectedIndex(notebook.getTabCount() - 1);     } 
  } 
  /**    * wait for incoming connections, spawn a connection thread when    * stuff comes in.    */   class SocketWaiter       extends Thread {     ServerSocket sSocket = null;     Listener listener;     int port;     boolean pleaseStop = false; 
    public SocketWaiter(Listener l, int p) {       listener = l;       port = p;       start();     } 
    public void run() {       try {         listener.setLeft(new JLabel(getMessage("wait00",                                                " Waiting for Connection...")));         listener.repaint();         sSocket = new ServerSocket(port);         for (; ; ) {           Socket inSocket = sSocket.accept(); 
          if (pleaseStop) {             break;           }           new Connection(listener, inSocket);           inSocket = null;         }       }       catch (Exception exp) {         if (!"socket closed".equals(exp.getMessage())) {           JLabel tmp = new JLabel(exp.toString()); 
          tmp.setForeground(Color.red);           listener.setLeft(tmp);           listener.setRight(new JLabel(""));           listener.stop();         }       }     } 
    /**      * force a halt by connecting to self and then closing the server socket      */     public void halt() {       try {         pleaseStop = true;         new Socket("127.0.0.1", port);         if (sSocket != null) {           sSocket.close();         }       }       catch (Exception e) {         LogPage.LogInfor(e.getMessage());       }     }   } 
  /**    * class to simulate slow connections by slowing down the system    */   static class SlowLinkSimulator {     private int delayBytes;     private int delayTime;     private int currentBytes;     private int totalBytes; 
    /**      * construct      * @param delayBytes bytes per delay; set to 0 for no delay      * @param delayTime delay time per delay in milliseconds      */     public SlowLinkSimulator(int delayBytes, int delayTime) {       this.delayBytes = delayBytes;       this.delayTime = delayTime;     } 
    /**      * construct by copying delay bytes and time, but not current      * count of bytes      * @param that source of data      */     public SlowLinkSimulator(SlowLinkSimulator that) {       this.delayBytes = that.delayBytes;       this.delayTime = that.delayTime;     } 
    /**      * how many bytes have gone past?      * @return      */     public int getTotalBytes() {       return totalBytes;     } 
    /**      * log #of bytes pumped. Will pause when necessary. This method is not      * synchronized      * @param bytes      */     public void pump(int bytes) {       totalBytes += bytes;       if (delayBytes == 0) {         //when not delaying, we are just a byte counter         return;       }       currentBytes += bytes;       if (currentBytes > delayBytes) {         //we have overshot. lets find out how far         int delaysize = currentBytes / delayBytes;         long delay = delaysize * (long) delayTime;         //move byte counter down to the remainder of bytes         currentBytes = currentBytes % delayBytes;         //now wait         try {           Thread.sleep(delay);         }         catch (InterruptedException e) {           ; //ignore the exception         }       }     } 
    /**      * get the current byte count      * @return      */     public int getCurrentBytes() {       return currentBytes;     } 
    /**      * set the current byte count      * @param currentBytes      */     public void setCurrentBytes(int currentBytes) {       this.currentBytes = currentBytes;     } 
  } 
  /**    * this class handles the pumping of data from the incoming socket to the    * outgoing socket    */   class SocketRR       extends Thread {     Socket inSocket = null;     Socket outSocket = null;     JTextArea textArea;     InputStream in = null;     OutputStream out = null;     boolean xmlFormat;     volatile boolean done = false;     TableModel tmodel = null;     int tableIndex = 0;     String type = null;     Connection myConnection = null;     SlowLinkSimulator slowLink; 
    public SocketRR(Connection c, Socket inputSocket, InputStream inputStream,                     Socket outputSocket, OutputStream outputStream,                     JTextArea _textArea, boolean format,                     TableModel tModel, int index, final String type,                     SlowLinkSimulator slowLink) {       inSocket = inputSocket;       in = inputStream;       outSocket = outputSocket;       out = outputStream;       textArea = _textArea;       xmlFormat = format;       tmodel = tModel;       tableIndex = index;       this.type = type;       myConnection = c;       this.slowLink = slowLink;       start();     } 
    public boolean isDone() {       return (done);     } 
    public void run() {       try {         byte[] buffer = new byte[4096];         byte[] tmpbuffer = new byte[8192];         int saved = 0;         int len;         int i1, i2;         int i;         int reqSaved = 0;         int tabWidth = 3;         boolean atMargin = true;         int thisIndent = -1,             nextIndent = -1,             previousIndent = -1; 
        if (tmodel != null) {           String tmpStr = (String) tmodel.getValueAt(tableIndex,               REQ_COLUMN); 
          if (!"".equals(tmpStr)) {             reqSaved = tmpStr.length();           }         } 
        a:         for (; ; ) {           if (done) {             break;           } 
          len = buffer.length;           // Used to be 1, but if we block it doesn't matter           // however 1 will break with some servers, including apache           if (len == 0) {             len = buffer.length;           }           if (saved + len > buffer.length) {             len = buffer.length - saved;           }           int len1 = 0; 
          while (len1 == 0) {             try {               len1 = in.read(buffer, saved, len);             }             catch (Exception ex) {               if (done && saved == 0) {                 break a;               }               len1 = -1;               break;             }           }           len = len1; 
          if (len == -1 && saved == 0) {             break;           }           if (len == -1) {             done = true;           } 
          // No matter how we may (or may not) format it, send it           // on unformatted - we don't want to mess with how its           // sent to the other side, just how its displayed           if (out != null && len > 0) {             slowLink.pump(len);             out.write(buffer, saved, len);           } 
          if (tmodel != null && reqSaved < 50) {             String old = (String) tmodel.getValueAt(tableIndex,                 REQ_COLUMN); 
            old = old + new String(buffer, saved, len);             if (old.length() > 50) {               old = old.substring(0, 50);             } 
            reqSaved = old.length(); 
            if ( (i = old.indexOf('\n')) > 0) {               old = old.substring(0, i - 1);               reqSaved = 50;             } 
            tmodel.setValueAt(old, tableIndex, REQ_COLUMN);           } 
          if (xmlFormat) {             // Do XML Formatting             boolean inXML = false;             int bufferLen = saved; 
            if (len != -1) {               bufferLen += len;             }             i1 = 0;             i2 = 0;             saved = 0;             for (; i1 < bufferLen; i1++) {               // Except when we're at EOF, saved last char               if (len != -1 && i1 + 1 == bufferLen) {                 saved = 1;                 break;               }               thisIndent = -1;               if (buffer[i1] == '<' && buffer[i1 + 1] != '/') {                 previousIndent = nextIndent++;                 thisIndent = nextIndent;                 inXML = true;               }               if (buffer[i1] == '<' && buffer[i1 + 1] == '/') {                 if (previousIndent > nextIndent) {                   thisIndent = nextIndent;                 }                 previousIndent = nextIndent--;                 inXML = true;               }               if (buffer[i1] == '/' && buffer[i1 + 1] == '>') {                 previousIndent = nextIndent--;                 inXML = true;               }               if (thisIndent != -1) {                 if (thisIndent > 0) {                   tmpbuffer[i2++] = (byte) '\n';                 }                 for (i = tabWidth * thisIndent; i > 0; i--) {                   tmpbuffer[i2++] = (byte) ' ';                 }               }               atMargin = (buffer[i1] == '\n' || buffer[i1] == '\r'); 
              if (!inXML || !atMargin) {                 tmpbuffer[i2++] = buffer[i1];               }             } 
            textArea.append(new String(tmpbuffer, 0, i2)); 
            // Shift saved bytes to the beginning             for (i = 0; i < saved; i++) {               buffer[i] = buffer[bufferLen - saved + i];             }           }           else {             textArea.append(new String(buffer, 0, len));           }         }       }       catch (Exception e) {         LogPage.LogInfor(e.getMessage());       }       finally {         done = true;         try {           if (out != null) {             out.flush();             if (null != outSocket) {               outSocket.shutdownOutput();             }             else {               out.close();             }             out = null;           }         }         catch (Exception e) {           LogPage.LogInfor(e.getMessage());         }         try {           if (in != null) {             if (inSocket != null) {               inSocket.shutdownInput();             }             else {               in.close();             }             in = null;           }         }         catch (Exception e) {           LogPage.LogInfor(e.getMessage());;         }         myConnection.wakeUp();       }     } 
    public void halt() {       try {         if (inSocket != null) {           inSocket.close();         }         if (outSocket != null) {           outSocket.close();         }         inSocket = null;         outSocket = null;         if (in != null) {           in.close();         }         if (out != null) {           out.close();         }         in = null;         out = null;         done = true;       }       catch (Exception e) {         LogPage.LogInfor(e.getMessage());       }     }   } 
  /**    * a connection listens to a single current connection    */   class Connection       extends Thread {     Listener listener;     boolean active;     String fromHost;     String time;     JTextArea inputText = null;     JScrollPane inputScroll = null;     JTextArea outputText = null;     JScrollPane outputScroll = null;     Socket inSocket = null;     Socket outSocket = null;     Thread clientThread = null;     Thread serverThread = null;     SocketRR rr1 = null;     SocketRR rr2 = null;     InputStream inputStream = null; 
    String HTTPProxyHost = null;     int HTTPProxyPort = 80;     private SlowLinkSimulator slowLink; 
    public Connection(Listener l) {       listener = l;       HTTPProxyHost = l.HTTPProxyHost;       HTTPProxyPort = l.HTTPProxyPort;       slowLink = l.slowLink;     } 
    public Connection(Listener l, Socket s) {       this(l);       inSocket = s;       start();     } 
    public Connection(Listener l, InputStream in) {       this(l);       inputStream = in;       start();     } 
    public void run() {       try {         active = true; 
        HTTPProxyHost = System.getProperty("http.proxyHost");         if (HTTPProxyHost != null && HTTPProxyHost.equals("")) {           HTTPProxyHost = null;         } 
        if (HTTPProxyHost != null) {           String tmp = System.getProperty("http.proxyPort"); 
          if (tmp != null && tmp.equals("")) {             tmp = null;           }           if (tmp == null) {             HTTPProxyPort = 80;           }           else {             HTTPProxyPort = Integer.parseInt(tmp);           }         } 
        if (inSocket != null) {           fromHost = (inSocket.getInetAddress()).getHostName();         }         else {           fromHost = "resend";         } 
        String dateformat = getMessage("dateformat00", "yyyy-MM-dd HH:mm:ss");         DateFormat df = new SimpleDateFormat(dateformat); 
        time = df.format(new Date()); 
        int count = listener.connections.size(); 
        listener.tableModel.insertRow(count + 1, new Object[] {                                       getMessage("active00", "Active"),                                       time,                                       fromHost,                                       listener.hostField.getText(), ""         }             );         listener.connections.add(this);         inputText = new JTextArea(null, null, 20, 80);         inputScroll = new JScrollPane(inputText);         outputText = new JTextArea(null, null, 20, 80);         outputScroll = new JScrollPane(outputText); 
        ListSelectionModel lsm = listener.connectionTable.getSelectionModel(); 
        if (count == 0 || lsm.getLeadSelectionIndex() == 0) {           listener.outPane.setVisible(false);           int divLoc = listener.outPane.getDividerLocation(); 
          listener.setLeft(inputScroll);           listener.setRight(outputScroll); 
          listener.removeButton.setEnabled(false);           listener.removeAllButton.setEnabled(true);           listener.saveButton.setEnabled(true);           listener.resendButton.setEnabled(true);           listener.outPane.setDividerLocation(divLoc);           listener.outPane.setVisible(true);         } 
        String targetHost = listener.hostField.getText();         int targetPort = Integer.parseInt(listener.tPortField.getText()); 
        InputStream tmpIn1 = inputStream;         OutputStream tmpOut1 = null; 
        InputStream tmpIn2 = null;         OutputStream tmpOut2 = null; 
        if (tmpIn1 == null) {           tmpIn1 = inSocket.getInputStream();         } 
        if (inSocket != null) {           tmpOut1 = inSocket.getOutputStream();         } 
        String bufferedData = null;         StringBuffer buf = null; 
        int index = listener.connections.indexOf(this); 
        if (listener.isProxyBox.isSelected() || HTTPProxyHost != null) {           // Check if we're a proxy           byte[] b = new byte[1]; 
          buf = new StringBuffer();           String s; 
          for (; ; ) {             int len; 
            len = tmpIn1.read(b, 0, 1);             if (len == -1) {               break;             }             s = new String(b);             buf.append(s);             if (b[0] != '\n') {               continue;             }             break;           } 
          bufferedData = buf.toString();           inputText.append(bufferedData); 
          if (bufferedData.startsWith("GET ") ||               bufferedData.startsWith("POST ")) {             int start, end;             URL url; 
            start = bufferedData.indexOf(' ') + 1;             while (bufferedData.charAt(start) == ' ') {               start++;             }             end = bufferedData.indexOf(' ', start);             String urlString = bufferedData.substring(start, end); 
            if (urlString.charAt(0) == '/') {               urlString = urlString.substring(1);             }             if (listener.isProxyBox.isSelected()) {               url = new URL(urlString);               targetHost = url.getHost();               targetPort = url.getPort();               if (targetPort == -1) {                 targetPort = 80;               }
  
              listener.tableModel.setValueAt(targetHost, index + 1,                                              OUTHOST_COLUMN);               bufferedData = bufferedData.substring(0, start) +                   url.getFile() +                   bufferedData.substring(end);             }             else {               url = new URL("http://" + targetHost + ":" +                             targetPort + "/" + urlString); 
              listener.tableModel.setValueAt(targetHost, index + 1,                                              OUTHOST_COLUMN);               bufferedData = bufferedData.substring(0, start) +                   url.toExternalForm() +                   bufferedData.substring(end); 
              targetHost = HTTPProxyHost;               targetPort = HTTPProxyPort;             } 
          }         }         else {           //           // Change Host: header to point to correct host           //           byte[] b1 = new byte[1]; 
          buf = new StringBuffer();           String s1;           String lastLine = null; 
          for (; ; ) {             int len; 
            len = tmpIn1.read(b1, 0, 1);             if (len == -1) {               break;             }             s1 = new String(b1);             buf.append(s1);             if (b1[0] != '\n') {               continue;             }             // we have a complete line             String line = buf.toString(); 
            buf.setLength(0);             // check to see if we have found Host: header             if (line.startsWith("Host: ")) {               // we need to update the hostname to target host               String newHost = "Host: " + targetHost + "\r\n"; 
              bufferedData = bufferedData.concat(newHost);               break;             }             // add it to our headers so far             if (bufferedData == null) {               bufferedData = line;             }             else {               bufferedData = bufferedData.concat(line);             } 
            // failsafe             if (line.equals("\r\n")) {               break;             }             if ("\n".equals(lastLine) && line.equals("\n")) {               break;             }             lastLine = line;           }           if (bufferedData != null) {             inputText.append(bufferedData);             int idx = bufferedData.length() < 50 ? bufferedData.length() : 50;             s1 = bufferedData.substring(0, idx);             int i = s1.indexOf('\n'); 
            if (i > 0) {               s1 = s1.substring(0, i - 1);             }             s1 = s1 + "                           " +                 "                       ";             s1 = s1.substring(0, 51);             listener.tableModel.setValueAt(s1, index + 1,                                            REQ_COLUMN);           }         } 
        if (targetPort == -1) {           targetPort = 80;         }         outSocket = new Socket(targetHost, targetPort); 
        tmpIn2 = outSocket.getInputStream();         tmpOut2 = outSocket.getOutputStream(); 
        if (bufferedData != null) {           byte[] b = bufferedData.getBytes();           tmpOut2.write(b);           slowLink.pump(b.length);         } 
        boolean format = listener.xmlFormatBox.isSelected(); 
        //this is the channel to the endpoint         rr1 = new SocketRR(this, inSocket, tmpIn1, outSocket,                            tmpOut2, inputText, format,                            listener.tableModel, index + 1, "request:", slowLink);         //create the response slow link from the inbound slow link         SlowLinkSimulator responseLink = new SlowLinkSimulator(slowLink);         //this is the channel from the endpoint         rr2 = new SocketRR(this, outSocket, tmpIn2, inSocket,                            tmpOut1, outputText, format,                            null, 0, "response:", responseLink); 
        while (rr1 != null || rr2 != null) {           // Only loop as long as the connection to the target           // machine is available - once that's gone we can stop.           // The old way, loop until both are closed, left us           // looping forever since no one closed the 1st one.           if (null != rr1 && rr1.isDone()) {             if (index >= 0 && rr2 != null) {               listener.tableModel.setValueAt(getMessage("resp00", "Resp"),                                              1 + index, STATE_COLUMN);             }             rr1 = null;           }           if (null != rr2 && rr2.isDone()) {             if (index >= 0 && rr1 != null) {               listener.tableModel.setValueAt(getMessage("req00", "Req"),                                              1 + index, STATE_COLUMN);             }             rr2 = null;           } 
          synchronized (this) {             this.wait(1000); //Safety just incase we're not told to wake up.           }         } 
        active = false; 
        if (index >= 0) {           listener.tableModel.setValueAt(getMessage("done00", "Done"),                                          1 + index, STATE_COLUMN); 
        }       }       catch (Exception e) {         StringWriter st = new StringWriter();         PrintWriter wr = new PrintWriter(st);         int index = listener.connections.indexOf(this); 
        if (index >= 0) {           listener.tableModel.setValueAt(getMessage("error00", "Error"),                                          1 + index, STATE_COLUMN);         }         e.printStackTrace(wr);         wr.close();         if (outputText != null) {           outputText.append(st.toString());         }         else {           //something went wrong before we had the output area           LogPage.LogInfor("outputText is null,so log the infor as \n'"+st.toString()+"'");         }         halt();       }     } 
    synchronized void wakeUp() {       this.notifyAll();     } 
    public void halt() {       try {         if (rr1 != null) {           rr1.halt();         }         if (rr2 != null) {           rr2.halt();         }         if (inSocket != null) {           inSocket.close();         }         inSocket = null;         if (outSocket != null) {           outSocket.close();         }         outSocket = null;       }       catch (Exception e) {         LogPage.LogInfor(e.getMessage());       }     } 
    public void remove() {       int index = -1; 
      try {         halt();         index = listener.connections.indexOf(this);         listener.tableModel.removeRow(index + 1);         listener.connections.remove(index);       }       catch (Exception e) {         LogPage.LogInfor("index:=" + index + this);       }     }   } 
   /**    * this is the log page    */   class LogPage       extends JPanel {     // Monitor log section     ///////////////////////////////////////////////////////////////////     public  JPanel logPanel = new JPanel(new BorderLayout());     public static JTextArea textArea = null;     public LogPage(JTabbedPane notebook, String name) {       logPanel.setBorder(new TitledBorder(TCPMonitor.getMessage("log01", "TCP Monitor Log")));       textArea = new JTextArea(null, null, 27, 93);       logPanel.add(new JScrollPane(textArea),BorderLayout.CENTER);       this.setLayout(new BorderLayout());       this.add(logPanel, BorderLayout.CENTER);       notebook.addTab(name, this);       notebook.repaint();       notebook.setSelectedIndex(notebook.getTabCount() - 1);       textArea.setEditable(true);     } 
    public static void LogInfor(String infor) {       textArea.append(infor+"\n");     }   } //EOC
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   
 
  |