KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > ch > ethz > ssh2 > channel > RemoteAcceptThread


1
2 package ch.ethz.ssh2.channel;
3
4 import java.io.IOException JavaDoc;
5 import java.net.Socket JavaDoc;
6
7 import ch.ethz.ssh2.log.Logger;
8
9 /**
10  * RemoteAcceptThread.
11  *
12  * @author Christian Plattner, plattner@inf.ethz.ch
13  * @version $Id: RemoteAcceptThread.java,v 1.4 2006/02/13 21:19:25 cplattne Exp $
14  */

15 public class RemoteAcceptThread extends Thread JavaDoc
16 {
17     private static final Logger log = Logger.getLogger(RemoteAcceptThread.class);
18
19     Channel c;
20
21     String JavaDoc remoteConnectedAddress;
22     int remoteConnectedPort;
23     String JavaDoc remoteOriginatorAddress;
24     int remoteOriginatorPort;
25     String JavaDoc targetAddress;
26     int targetPort;
27
28     Socket JavaDoc s;
29
30     public RemoteAcceptThread(Channel c, String JavaDoc remoteConnectedAddress, int remoteConnectedPort,
31             String JavaDoc remoteOriginatorAddress, int remoteOriginatorPort, String JavaDoc targetAddress, int targetPort)
32     {
33         this.c = c;
34         this.remoteConnectedAddress = remoteConnectedAddress;
35         this.remoteConnectedPort = remoteConnectedPort;
36         this.remoteOriginatorAddress = remoteOriginatorAddress;
37         this.remoteOriginatorPort = remoteOriginatorPort;
38         this.targetAddress = targetAddress;
39         this.targetPort = targetPort;
40
41         if (log.isEnabled())
42             log.log(20, "RemoteAcceptThread: " + remoteConnectedAddress + "/" + remoteConnectedPort + ", R: "
43                     + remoteOriginatorAddress + "/" + remoteOriginatorPort);
44     }
45
46     public void run()
47     {
48         try
49         {
50             c.cm.sendOpenConfirmation(c);
51
52             s = new Socket JavaDoc(targetAddress, targetPort);
53
54             StreamForwarder r2l = new StreamForwarder(c, null, null, c.getStdoutStream(), s.getOutputStream(),
55                     "RemoteToLocal");
56             StreamForwarder l2r = new StreamForwarder(c, null, null, s.getInputStream(), c.getStdinStream(),
57                     "LocalToRemote");
58
59             /* No need to start two threads, one can be executed in the current thread */
60             
61             r2l.setDaemon(true);
62             r2l.start();
63             l2r.run();
64
65             while (r2l.isAlive())
66             {
67                 try
68                 {
69                     r2l.join();
70                 }
71                 catch (InterruptedException JavaDoc e)
72                 {
73                 }
74             }
75
76             /* If the channel is already closed, then this is a no-op */
77
78             c.cm.closeChannel(c, "EOF on both streams reached.", true);
79             s.close();
80         }
81         catch (IOException JavaDoc e)
82         {
83             log.log(50, "IOException in proxy code: " + e.getMessage());
84
85             try
86             {
87                 c.cm.closeChannel(c, "IOException in proxy code (" + e.getMessage() + ")", true);
88             }
89             catch (IOException JavaDoc e1)
90             {
91             }
92             try
93             {
94                 if (s != null)
95                     s.close();
96             }
97             catch (IOException JavaDoc e1)
98             {
99             }
100         }
101     }
102 }
103
Popular Tags