Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Duplicate Python websockets

See more WebSocket Examples

Demonstrates how to duplicate the following Python client-side websocket snippet:
async with websockets.connect('ws://192.168.1.35/websocket') as websocket:
await websocket.send("http.controller_login:username=xxx&password=xxxxx")
response = await websocket.recv()

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.WebSocket,
  Chilkat.Rest;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  rest: TRest;
  ws: TWebSocket;
  responseBody: string;
  statusCode: Integer;
  finalFrame: Boolean;
  receivedStr: string;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  //  In Python, the following line of code does more than just connect:
  //  
  //       websockets.connect('ws://192.168.1.35/websocket')
  //  
  //  It is connecting to 192.168.1.35 without using TLS.  If the URI starts with "wss://", then TLS should be used.
  //  But this URI begins with just "ws:/", so no TLS.

  //  Also, after connecting, a GET request is sent to the /websocket endpoint.
  //  In summary, the websockets.connect function is establishing the connection and it sends a GET request.

  //  First establish the connection.
  //  No TLS, use the default HTTP port 80.
  rest := TRest.Create;
  success := rest.Connect('192.168.1.35',80,False,False);
  if (success <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  ws := TWebSocket.Create;

  //  Tell the WebSocket to use this connection.
  success := ws.UseConnection(rest);
  if (success <> True) then
    begin
      WriteLn(ws.LastErrorText);
      Exit;
    end;

  //  Add the standard WebSocket open handshake headers that will be needed.
  //  (This adds the required HTTP request headers to the rest object.)
  ws.AddClientHeaders();

  //  Now send the GET request to /websockets.
  responseBody := rest.FullRequestNoBody('GET','/websockets');
  if (rest.LastMethodSuccess <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    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..)
  statusCode := rest.ResponseStatusCode;
  WriteLn('Response status code: ' + statusCode);

  if (statusCode <> 101) then
    begin
      WriteLn(responseBody);
      WriteLn('-- Failed because of unexpected response status code.');
      Exit;
    end;

  //  We have the expected 101 response, so let's now validate the 
  //  contents of the response.
  success := ws.ValidateServerHandshake();
  if (success <> True) then
    begin
      WriteLn(ws.LastErrorText);
      Exit;
    end;

  WriteLn('WebSocket connection successful.');

  //  The application may now begin sending and receiving frames on the WebSocket connection.

  //  The 1st frame sent by the Python snippet is:
  //  
  //      websocket.send("http.controller_login:username=xxx&password=xxxxx")
  //  

  //  Send the same using Chilkat, and get the response.
  finalFrame := True;
  success := ws.SendFrame('http.controller_login:username=xxx&password=xxxxx',finalFrame);
  if (success <> True) then
    begin
      WriteLn(ws.LastErrorText);
      Exit;
    end;

  //  Read an incoming frame.
  success := ws.ReadFrame();
  if (success <> True) then
    begin
      WriteLn('Failed to receive a frame');
      WriteLn('ReadFrame fail reason = ' + ws.ReadFrameFailReason);
      WriteLn(ws.LastErrorText);
      Exit;
    end;

  //  Show the string that was received.
  receivedStr := ws.GetFrameData();
  WriteLn('Received: ' + receivedStr);

  //  Continue with whatever additional communications are desired...
  //  ....
  //  


  rest.Free;
  ws.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.