01: /* Copyright 2004 Inderjeet Singh. All rights reserved. You may not modify,
02: * use, reproduce or distribute this software except in compliance with the
03: * terms of the license at http://tcpmon.dev.java.net/
04: * $Id: RequestSender.java,v 1.3 2004/11/14 19:28:55 inder Exp $ */
05:
06: package tcpmon;
07:
08: import java.net.*;
09: import java.io.*;
10:
11: /**
12: *
13: * @author Inderjeet Singh
14: */
15: public class RequestSender extends Thread {
16:
17: public RequestSender(String data, TunnelConfig config,
18: CallBack callback) {
19: this (data.getBytes(), config, callback);
20: }
21:
22: public RequestSender(byte[] data, TunnelConfig config,
23: CallBack callback) {
24: this .data = data;
25: this .config = config;
26: this .callback = callback;
27: this .start();
28: }
29:
30: public void run() {
31: Socket s = null;
32: CallBack.CallBackData callbackdata = new CallBack.CallBackData(
33: config.localPort, REPORTED_CLIENT_NAME,
34: config.serverName);
35: ByteArrayOutputStream reverseData = new ByteArrayOutputStream();
36: try {
37: s = new Socket(config.serverName, config.serverPort);
38: InputStream forwardData = new ByteArrayInputStream(data);
39: Thread forward = new StreamThread(forwardData, s
40: .getOutputStream());
41: forward.start();
42:
43: // Reuse the current thread for one of the streams
44: Thread reverse = new StreamThread(s.getInputStream(),
45: reverseData);
46: //reverse.start();
47: reverse.run();
48:
49: forward.join();
50: //reverse.join();
51: } catch (Exception e) {
52: reportException(e);
53: } finally {
54: try {
55: if (s != null) {
56: s.close();
57: }
58: } catch (Exception e) {
59: reportException(e);
60: }
61: // System.out.println(reverseData.toString());
62: callbackdata.set(new String(data), reverseData.toString());
63: callbackdata.setState(Tunnel.FINISHED);
64: callback.connectionFinished(callbackdata);
65: }
66: }
67:
68: private void reportException(Exception e) {
69: String stackTrace = Utils.extractStackTrace(e);
70: CallBack.CallBackData callbackdata = new CallBack.CallBackData(
71: config.localPort, REPORTED_CLIENT_NAME,
72: config.serverName);
73: callbackdata.set(stackTrace, "");
74: callbackdata.setState(Tunnel.FAILED);
75: callback.connectionFinished(callbackdata);
76: }
77:
78: private byte[] data;
79: private TunnelConfig config;
80: private CallBack callback;
81: private static final String REPORTED_CLIENT_NAME = "tcpmon-localhost";
82: }
|