Tcl
Tcl
WebSocket Send/Receive Binary Data
See more WebSocket Examples
Demonstrates how to send and receive binary data on a websocket. 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 Tcl Downloads
load ./chilkat.dll
set success 0
# This example requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.
set ws [new_CkWebSocket]
# 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.
set rest [new_CkRest]
# 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.
set success [CkRest_Connect $rest "websockets.chilkat.io" 80 0 0]
CkWebSocket_UseConnection $ws $rest
CkWebSocket_AddClientHeaders $ws
set responseBodyIgnored [CkRest_fullRequestNoBody $rest "GET" "/wsChilkatEcho.ashx"]
set success [CkWebSocket_ValidateServerHandshake $ws]
if {$success != 1} then {
puts [CkWebSocket_lastErrorText $ws]
delete_CkWebSocket $ws
delete_CkRest $rest
exit
}
# This example sends a small JPG file (about 7KB) in a websocket frame.
set jpgData [new_CkBinData]
set success [CkBinData_LoadFile $jpgData "qa_data/jpg/starfish.jpg"]
puts "Number of bytes to send = [CkBinData_get_NumBytes $jpgData]"
# Send a frame containing the JPG image data.
# This will be the first and final frame, and therefore this constitutes the entire message.
set finalFrame 1
set success [CkWebSocket_SendFrameBd $ws $jpgData $finalFrame]
if {$success != 1} then {
puts [CkWebSocket_lastErrorText $ws]
delete_CkWebSocket $ws
delete_CkRest $rest
delete_CkBinData $jpgData
exit
}
# Read the echoed binary frame(s).
# (We sent the JPG file in a single frame, but we may receive the echo in multiple frames, but it will be one message.)
# Read an incoming frames until we receive the final frame.
set receivedFinalFrame 0
while {$receivedFinalFrame == 0} {
# The ws object is accumulating the received data internally. Once we get the final frame, we'll get the
# accumulated data which should constitute the entire JPG.
set success [CkWebSocket_ReadFrame $ws]
if {$success != 1} then {
puts "Failed to receive a frame"
puts "ReadFrame fail reason = [CkWebSocket_get_ReadFrameFailReason $ws]"
puts [CkWebSocket_lastErrorText $ws]
delete_CkWebSocket $ws
delete_CkRest $rest
delete_CkBinData $jpgData
exit
}
set receivedFinalFrame [CkWebSocket_get_FinalFrame $ws]
# Show the opcode and final frame bit for the frame just received:
puts "Frame opcode: [CkWebSocket_frameOpcode $ws]"
puts "Final frame: $receivedFinalFrame"
}
# Get the accumulated received data.
set jpgReceivedData [new_CkBinData]
CkWebSocket_GetFrameDataBd $ws $jpgReceivedData
puts "Received [CkBinData_get_NumBytes $jpgReceivedData] bytes"
# Save the received JPG to a file so we can check it..
CkBinData_WriteFile $jpgReceivedData "qa_output/starfish_ws.jpg"
# Close the websocket connection.
set success [CkWebSocket_SendClose $ws 1 1000 "Closing this websocket."]
if {$success != 1} then {
puts [CkWebSocket_lastErrorText $ws]
delete_CkWebSocket $ws
delete_CkRest $rest
delete_CkBinData $jpgData
delete_CkBinData $jpgReceivedData
exit
}
# Read the Close response.
set success [CkWebSocket_ReadFrame $ws]
if {$success != 1} then {
puts "ReadFrame fail reason = [CkWebSocket_get_ReadFrameFailReason $ws]"
puts [CkWebSocket_lastErrorText $ws]
delete_CkWebSocket $ws
delete_CkRest $rest
delete_CkBinData $jpgData
delete_CkBinData $jpgReceivedData
exit
}
# Should receive the "Close" opcode.
puts "Received opcode: [CkWebSocket_frameOpcode $ws]"
# Should be the same status code we sent (1000)
puts "Received close status code: [CkWebSocket_get_CloseStatusCode $ws]"
# The server may echo the close reason. If not, this will be empty.
puts "Echoed close reason: [CkWebSocket_closeReason $ws]"
puts "Success."
delete_CkWebSocket $ws
delete_CkRest $rest
delete_CkBinData $jpgData
delete_CkBinData $jpgReceivedData