分享
 
 
 

soap监视器

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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(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] == '<' && 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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有