soap监视器 (转)

soap监视器 (转)[@more@]

1.SOAp监视器原理:soap监视器通过tcpip协议截获和转发soap请求,并且显示相关的soap封装信息,使开发人员可以轻松的调试web服务,它的原理如下:

.NET/develop/article/images/ws-tcpmonitor.gif" align=baseline border=0>

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(Mailto:yellowicq@xinhuanet.com">yellowicq@xinhuanet.com)
 */

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] == '  previousIndent = nextIndent++;
  thisIndent = nextIndent;
  inXML = true;
  }
  if (buffer[i1] == '  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 + "rn";

  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("rn")) {
  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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-993010/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-993010/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值