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

WebSocket Connect

See more WebSocket Examples

Demonstrates how to establish a WebSocket connection. Once the connection is established, messages may be sent back-and-forth. Messages are sent in frames, where the last frame in the message is indicated by a "final" bit. A frame constitutes the entire message if the first frame sent has the "final" bit sent. (In most cases, you'll probably be sending single-frame messages.)

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;

begin
  success := False;

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

  //  --------------------------------------------------
  //  A WebSocket connection begins life as an HTTP GET request containing a few special header fields,
  //  such as "Upgrade: websocket".   

  //  Your application will use the Chilkat Rest class to send the initial HTTP GET.  This allows you
  //  to use the full capability of the Chilkat Rest class to customize the GET for any particular situation.
  //  For example:
  //  
  //    - If custom HTTP request header fields must be added.
  //    - If authentication is required, such as OAuth2, OAuth1, Basic HTTP Auth, etc.
  //    - If HTTPS, SSH Tunneling, Proxies (HTTP or SOCKS), or other advanced connection or TLS features are required.
  //  

  rest := TRest.Create;
  success := rest.Connect('someserver.com',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();

  //  Add any additional headers that might be desired.
  //  Two common WebSocketSpecific headers are "Sec-WebSocket-Protocol" and "Origin".
  rest.AddHeader('Sec-WebSocket-Protocol','x-something');
  rest.AddHeader('Origin','http://someserver.com');

  //  Do the open handshake.
  responseBody := rest.FullRequestNoBody('GET','/something');
  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, such as the value sent by the server in the
  //  Sec-WebSocket-Accept header. 
  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.
  //  (At this point, we're done with the rest object...)


  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.