If you want to be fully asynchronous, you need to use listeners.

sshClient.connect( host, port ).addListener(
new SshFutureListener<ConnectFuture> {
   public void operationComplete( ConnectFuture connect ) {
      ClientSession session = connect.getSession();
      // start authentication process ...
   }
});



On Fri, Sep 28, 2012 at 2:02 PM, Kevin Winchester <
kevin.winches...@anywaregroup.com> wrote:

> On Thu, Sep 27, 2012 at 8:44 PM, Kevin Winchester <
>> kevin.winches...@anywaregroup.**com <kevin.winches...@anywaregroup.com>>
>> wrote:
>>
>>  Hi,
>>>
>>> I see that TCP/IP forwarding has been added to the SSHD client in the
>>> upcoming 0.8.0 release.  I have grabbed the latest code from SVN to try
>>> it
>>> out, but I have a few questions:
>>>
>>> 1. Is there any sample code for how to use it?  I basically am doing the
>>> following:
>>>
>>> SshClient sshClient = SshClient.setUpDefaultClient()****;
>>>
>>> sshClient.start();
>>> ClientSession clientSession = sshClient.connect( host, port
>>> ).await().getSession();
>>> clientSession.authPassword( username, password ).await();
>>> clientSession.****startLocalPortForwarding( new SshdSocketAddress(
>>>
>>> localAddress, localPort ), new SshdSocketAddress( remoteAddress,
>>> remotePort
>>> ) );
>>>
>>> I don't want any shell or execution channel, just the port forwarding. Is
>>> that the best way to make use of the feature?
>>>
>>>
>> Yes
>>
>
> Great, thanks.  I plan to make more use of the asynchronous nature of the
> API in the future.  Would I be able to call connect(), authPassword() and
> startLocalPortForwarding() without calling await() on any of the Futures
> first?
>
> Hmm. Looking at the code, it looks like I cannot get a valid ClientSession
> from the ConnectFuture until the connection is complete, so I guess I would
> not be able to call authPassword() without first waiting.  I don't see the
> same dependencies between authPassword() and startLocalPortForwarding()
> though.  Should I be able to call those in sequence, or should I call
> await() on the AuthFuture first?
>
>
>
>>
>>
>>> 2. When I run the above code, the channel seems to work correctly, until
>>> I
>>> disconnect for the first time, at which point the channel seems to close
>>> itself.  Is that something I am doing wrong, or is it the intended
>>> behavior?  Any other SSH client I have used maintains the forwarded
>>> channel
>>> across multiple disconnects/reconnects.
>>>
>>>
>> I've just added a loop to the unit test we have and the current code seems
>> to support multiple socket opening/close correctly.
>> See testLocalForwardingNative  in
>> https://github.com/apache/**mina-sshd/blob/trunk/sshd-**
>> core/src/test/java/org/apache/**sshd/PortForwardingTest.java#**L189<https://github.com/apache/mina-sshd/blob/trunk/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java#L189>
>> Channels are created for each incoming socket connection on the remote
>> side.
>> Are you saying that the channel is kept opened for a certain amount of
>> time
>> before being closed if not reused ?
>> I suppose I can see the use case for example when using HTTP 1.0, but I
>> must admit that did not crossed my mind.
>> Feel free to raise a JIRA issue and eventually propose a patch if you're
>> fancy working on it.
>>
>>
> I just tried again this morning and I saw exactly what you describe - new
> channels were created for each connection to the forwarded port. I'm not
> sure what was going on yesterday, but I'll continue my testing.  If I see
> the disconnection again, I'll grab the logs from server and client (both
> are SSHD) and post them here.
>
>
>
>>  3. I see that there is a createDirectTcpipChannel method in the
>>> ClientSession class as well, that seems to create a completely different
>>> implementation of a forwarded TCP/IP channel.  What is that used for?
>>>
>>>
>> The main difference is that the startLocalPortForwarding opens a server
>> socket and will channel incoming connection through the ssh layer.
>>  The createDirectTcpipChannel serves a slightly different purpose which is
>> to stream data from java to the remote host, so no socket is opened and
>> you
>> have to give the input / output / error streams instead.
>> The reason the implementation is different is mainly because in
>> the startLocalPortForwarding case, no java streams are used, and we use
>> bio
>> buffers, so even if ssh layer is used in the same way, the client side is
>> slightly different.
>>
>>
> Good to know - thanks.  The reason I asked is that the
> startLocalPortForwarding method does not return any reference to the
> channel.  The reason I wanted to get the channel is that I was wondering if
> there is a way to add a listener for channel events.  Or alternatively, I
> would love to be able to monitor the socket that gets opened for port
> forwarding to know when it is ready/in use/closed.  Is there any support
> for those kinds of things?  If not, would you be willing to accept them if
> I managed to get them added to the code?
>
> Thanks again for the quick responses.  The more I look into the
> well-organized code from this project, and the more I see your willingness
> to help out users, the happier I am getting about choosing SSHD for my
> project.
>
> Kevin
>
>


-- 
------------------------
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
FuseSource, Integration everywhere
http://fusesource.com

Reply via email to