SQL Server
SQL Server
Send and Receive WebSocket Frame
See more WebSocket Examples
Demonstrates how to send a websocket text frame to a websocket echo server. This example uses Chilkat's websocket test echo server at ws://websockets.chilkat.io/wsChilkatEcho.ashx
Note: The websockets.chilkat.io server imposes the following limitations:
Messages must be 16K or less, and each connection is limited to a max of 16 echoed messages.
Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
DECLARE @ws int
EXEC @hr = sp_OACreate 'Chilkat.WebSocket', @ws OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
-- For brevity, this example does not check for errors when etablishing the WebSocket connection.
-- See Establish WebSocket Connection for more complete sample code for making the connection.
DECLARE @rest int
EXEC @hr = sp_OACreate 'Chilkat.Rest', @rest OUT
-- Connect to websockets.chilkat.io
-- IMPORTANT: websockets.chilkat.io accepts frames of up to 16K in size and echoes them back.
-- IMPORTANT: The websockets.chilkat.io server imposes the following limitations:
-- ---------- Messages must be 16K or less, and each connection is limited to a max of 16 echoed messages.
EXEC sp_OAMethod @rest, 'Connect', @success OUT, 'websockets.chilkat.io', 80, 0, 0
EXEC sp_OAMethod @ws, 'UseConnection', @success OUT, @rest
EXEC sp_OAMethod @ws, 'AddClientHeaders', @success OUT
DECLARE @responseBodyIgnored nvarchar(4000)
EXEC sp_OAMethod @rest, 'FullRequestNoBody', @responseBodyIgnored OUT, 'GET', '/wsChilkatEcho.ashx'
EXEC sp_OAMethod @ws, 'ValidateServerHandshake', @success OUT
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
RETURN
END
-- This example demonstrates sending a frame and receiving a text frame.
-- Send a frame containing the string "Hello World!"
-- This will be the first and final frame, and therefore this constitutes the entire message.
DECLARE @finalFrame int
SELECT @finalFrame = 1
EXEC sp_OAMethod @ws, 'SendFrame', @success OUT, 'Hello World!', @finalFrame
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
RETURN
END
-- Read an incoming frame.
EXEC sp_OAMethod @ws, 'ReadFrame', @success OUT
IF @success <> 1
BEGIN
PRINT 'Failed to receive a frame'
EXEC sp_OAGetProperty @ws, 'ReadFrameFailReason', @iTmp0 OUT
PRINT 'ReadFrame fail reason = ' + @iTmp0
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
RETURN
END
-- Show the string that was received.
DECLARE @receivedStr nvarchar(4000)
EXEC sp_OAMethod @ws, 'GetFrameData', @receivedStr OUT
PRINT 'Received: ' + @receivedStr
-- Close the websocket connection.
EXEC sp_OAMethod @ws, 'SendClose', @success OUT, 1, 1000, 'Closing this websocket.'
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
RETURN
END
-- Read the Close response.
EXEC sp_OAMethod @ws, 'ReadFrame', @success OUT
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ws, 'ReadFrameFailReason', @iTmp0 OUT
PRINT 'ReadFrame fail reason = ' + @iTmp0
EXEC sp_OAGetProperty @ws, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
RETURN
END
-- Should receive the "Close" opcode.
EXEC sp_OAGetProperty @ws, 'FrameOpcode', @sTmp0 OUT
PRINT 'Received opcode: ' + @sTmp0
-- Should be the same status code we sent (1000)
EXEC sp_OAGetProperty @ws, 'CloseStatusCode', @iTmp0 OUT
PRINT 'Received close status code: ' + @iTmp0
-- The server may echo the close reason. If not, this will be empty.
EXEC sp_OAGetProperty @ws, 'CloseReason', @sTmp0 OUT
PRINT 'Echoed close reason: ' + @sTmp0
PRINT 'Success.'
EXEC @hr = sp_OADestroy @ws
EXEC @hr = sp_OADestroy @rest
END
GO