Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(DataFlex) WebSocket through SSH TunnelThis example shows how to establish a WebSocket connection through an SSH tunnel. The WebSocket protocol communications will be encapsulated within an SSH tunnel.
Use ChilkatAx-win32.pkg Procedure Test Handle hoTunnel String sSshHostname Integer iSshPort Boolean iSuccess Variant vChannel Handle hoChannel Boolean iBTls Integer iPort Integer iMaxWaitMs Variant vRest Handle hoRest Handle hoWs String sResponseBody Integer iStatusCode String sTemp1 Boolean bTemp1 // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. // -------------------------------------------------- // This example borrows the code from the REST through SSH Tunnel example. // We first use the Chilkat Socket object to establish a connection to the WebSocket server through an SSH Tunnel. // Next, the Rest object uses the Socket object for its connection. // Finally, the WebSocket object uses the Rest object for its connection. // // Hopefully the flexibility of this architecture is easy to see. All of the HTTP functionality of the Rest object, // such as HTTP authentication, custom headers, etc. is available to the WebSocket. Likewise, all of the advanced functionality // of the Socket object is in turn available to the Rest object. // The high-level steps for accomplishing the task of running the WebSocket protocol through an SSH accomplished as follows: // 1) Create the SSH tunnel using Chilkat Socket. // 2) Open a port-forwarding channel (to the WebSocket server) within the tunnel. // 2) Tell Rest to use the Socket object. // 3) Tell WebSocket to use the Rest object. Get Create (RefClass(cComChilkatSocket)) To hoTunnel If (Not(IsComObjectCreated(hoTunnel))) Begin Send CreateComObject of hoTunnel End Move "sftp.example.com" To sSshHostname Move 22 To iSshPort // Connect to an SSH server and establish the SSH tunnel: Get ComSshOpenTunnel Of hoTunnel sSshHostname iSshPort To iSuccess If (iSuccess <> True) Begin Get ComLastErrorText Of hoTunnel To sTemp1 Showln sTemp1 Procedure_Return End // Authenticate with the SSH server via a login/password // or with a public key. // This example demonstrates SSH password authentication. Get ComSshAuthenticatePw Of hoTunnel "mySshLogin" "mySshPassword" To iSuccess If (iSuccess <> True) Begin Get ComLastErrorText Of hoTunnel To sTemp1 Showln sTemp1 Procedure_Return End // OK, the SSH tunnel is setup. Now open a channel within the tunnel. Move True To iBTls Move 443 To iPort Move 5000 To iMaxWaitMs // This returns a socket object that is a single channel within the SSH tunnel. // The SSH channel is our logical port-forwarded connection through the SSH tunnel. // Note: This example establishes a TLS connection to the target WebSocket server. // (The TLS protocol will run on the logical channel within the SSH tunnel.) // Your application can just as easily make a non-TLS connection by changing the arguments // passed to SshOpenChannel. Get ComSshOpenChannel Of hoTunnel "some-websocket-server.com" iPort iBTls iMaxWaitMs To vChannel If (IsComObject(vChannel)) Begin Get Create (RefClass(cComChilkatSocket)) To hoChannel Set pvComObject Of hoChannel To vChannel End Get ComLastMethodSuccess Of hoTunnel To bTemp1 If (bTemp1 <> True) Begin Get ComLastErrorText Of hoTunnel To sTemp1 Showln sTemp1 Procedure_Return End // Create a REST object and tell it to use the SSH channel. // This connection is a TLS running on an SSH channel through an SSH tunnel. // In other words, TLS is wrapped within the SSH tunnel. Get Create (RefClass(cComChilkatRest)) To hoRest If (Not(IsComObjectCreated(hoRest))) Begin Send CreateComObject of hoRest End Get ComUseConnection Of hoRest vChannel False To iSuccess If (iSuccess <> True) Begin Get ComLastErrorText Of hoRest To sTemp1 Showln sTemp1 Send Destroy of hoChannel Procedure_Return End // Finally, tell our WebSocket object to use the Rest object.. Get Create (RefClass(cComChilkatWebSocket)) To hoWs If (Not(IsComObjectCreated(hoWs))) Begin Send CreateComObject of hoWs End // Tell the WebSocket to use this connection. Get pvComObject of hoRest to vRest Get ComUseConnection Of hoWs vRest To iSuccess If (iSuccess <> True) Begin Get ComLastErrorText Of hoWs To sTemp1 Showln sTemp1 Procedure_Return End // Add the standard WebSocket open handshake headers that will be needed. // (This adds the required HTTP request headers to the rest object.) Get ComAddClientHeaders Of hoWs To iSuccess // Add any additional headers that might be desired. // Two common WebSocketSpecific headers are "Sec-WebSocket-Protocol" and "Origin". Get ComAddHeader Of hoRest "Sec-WebSocket-Protocol" "x-some-websocket-subprotocol" To iSuccess Get ComAddHeader Of hoRest "Origin" "http://some-websocket-server.com" To iSuccess // Do the open handshake. Get ComFullRequestNoBody Of hoRest "GET" "/something" To sResponseBody Get ComLastMethodSuccess Of hoRest To bTemp1 If (bTemp1 <> True) Begin Get ComLastErrorText Of hoRest To sTemp1 Showln sTemp1 Procedure_Return End // If successful, the HTTP response status code should be 101, // and the response body will be empty. (If it failed, we'll have a look // at the response body..) Get ComResponseStatusCode Of hoRest To iStatusCode Showln "Response status code: " iStatusCode If (iStatusCode <> 101) Begin Showln sResponseBody Showln "-- Failed because of unexpected response status code." Procedure_Return End // We have the expected 101 response, so let's now validate the // contents of the response, such as the value sent by the server in the // Sec-WebSocket-Accept header. Get ComValidateServerHandshake Of hoWs To iSuccess If (iSuccess <> True) Begin Get ComLastErrorText Of hoWs To sTemp1 Showln sTemp1 Procedure_Return End Showln "WebSocket connection successful." // The application may now begin sending and receiving frames on the WebSocket connection. // (At this point, we're done with the rest object...) End_Procedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.