01: package ch.ethz.ssh2;
02:
03: import java.io.IOException;
04: import java.io.InputStream;
05: import java.io.OutputStream;
06:
07: import ch.ethz.ssh2.channel.Channel;
08: import ch.ethz.ssh2.channel.ChannelManager;
09: import ch.ethz.ssh2.channel.LocalAcceptThread;
10:
11: /**
12: * A <code>LocalStreamForwarder</code> forwards an Input- and Outputstream
13: * pair via the secure tunnel to another host (which may or may not be identical
14: * to the remote SSH-2 server).
15: *
16: * @author Christian Plattner, plattner@inf.ethz.ch
17: * @version $Id: LocalStreamForwarder.java,v 1.6 2006/02/14 19:43:16 cplattne Exp $
18: */
19: public class LocalStreamForwarder {
20: ChannelManager cm;
21:
22: String host_to_connect;
23: int port_to_connect;
24: LocalAcceptThread lat;
25:
26: Channel cn;
27:
28: LocalStreamForwarder(ChannelManager cm, String host_to_connect,
29: int port_to_connect) throws IOException {
30: this .cm = cm;
31: this .host_to_connect = host_to_connect;
32: this .port_to_connect = port_to_connect;
33:
34: cn = cm.openDirectTCPIPChannel(host_to_connect,
35: port_to_connect, "127.0.0.1", 0);
36: }
37:
38: /**
39: * @return An <code>InputStream</code> object.
40: * @throws IOException
41: */
42: public InputStream getInputStream() throws IOException {
43: return cn.getStdoutStream();
44: }
45:
46: /**
47: * Get the OutputStream. Please be aware that the implementation MAY use an
48: * internal buffer. To make sure that the buffered data is sent over the
49: * tunnel, you have to call the <code>flush</code> method of the
50: * <code>OutputStream</code>. To signal EOF, please use the
51: * <code>close</code> method of the <code>OutputStream</code>.
52: *
53: * @return An <code>OutputStream</code> object.
54: * @throws IOException
55: */
56: public OutputStream getOutputStream() throws IOException {
57: return cn.getStdinStream();
58: }
59:
60: /**
61: * Close the underlying SSH forwarding channel and free up resources.
62: * You can also use this method to force the shutdown of the underlying
63: * forwarding channel. Pending output (OutputStream not flushed) will NOT
64: * be sent. Pending input (InputStream) can still be read. If the shutdown
65: * operation is already in progress (initiated from either side), then this
66: * call is a no-op.
67: *
68: * @throws IOException
69: */
70: public void close() throws IOException {
71: cm.closeChannel(cn, "Closed due to user request.", true);
72: }
73: }
|