/* Copyright 2004 Inderjeet Singh. All rights reserved. You may not modify,
* use, reproduce or distribute this software except in compliance with the
* terms of the license at http://tcpmon.dev.java.net/
* $Id: RequestSender.java,v 1.3 2004/11/14 19:28:55 inder Exp $ */
package tcpmon;
import java.net.*;
import java.io.*;
/**
*
* @author Inderjeet Singh
*/
public class RequestSender extends Thread {
public RequestSender(String data, TunnelConfig config, CallBack callback) {
this(data.getBytes(), config, callback);
}
public RequestSender(byte[] data, TunnelConfig config, CallBack callback) {
this.data = data;
this.config = config;
this.callback = callback;
this.start();
}
public void run() {
Socket s = null;
CallBack.CallBackData callbackdata = new CallBack.CallBackData(config.localPort, REPORTED_CLIENT_NAME, config.serverName);
ByteArrayOutputStream reverseData = new ByteArrayOutputStream();
try {
s = new Socket(config.serverName, config.serverPort);
InputStream forwardData = new ByteArrayInputStream(data);
Thread forward = new StreamThread(forwardData, s.getOutputStream());
forward.start();
// Reuse the current thread for one of the streams
Thread reverse = new StreamThread(s.getInputStream(), reverseData);
//reverse.start();
reverse.run();
forward.join();
//reverse.join();
} catch (Exception e) {
reportException(e);
} finally {
try {
if (s != null) {
s.close();
}
} catch (Exception e) {
reportException(e);
}
// System.out.println(reverseData.toString());
callbackdata.set(new String(data), reverseData.toString());
callbackdata.setState(Tunnel.FINISHED);
callback.connectionFinished(callbackdata);
}
}
private void reportException(Exception e) {
String stackTrace = Utils.extractStackTrace(e);
CallBack.CallBackData callbackdata = new CallBack.CallBackData(config.localPort, REPORTED_CLIENT_NAME, config.serverName);
callbackdata.set(stackTrace, "");
callbackdata.setState(Tunnel.FAILED);
callback.connectionFinished(callbackdata);
}
private byte[] data;
private TunnelConfig config;
private CallBack callback;
private static final String REPORTED_CLIENT_NAME = "tcpmon-localhost";
}
|