PureBasic
PureBasic
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 PureBasic Downloads
IncludeFile "CkRest.pb"
IncludeFile "CkWebSocket.pb"
Procedure ChilkatExample()
success.i = 0
; 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.i = CkRest::ckCreate()
If rest.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkRest::ckConnect(rest,"192.168.1.35",80,0,0)
If success <> 1
Debug CkRest::ckLastErrorText(rest)
CkRest::ckDispose(rest)
ProcedureReturn
EndIf
ws.i = CkWebSocket::ckCreate()
If ws.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; Tell the WebSocket to use this connection.
success = CkWebSocket::ckUseConnection(ws,rest)
If success <> 1
Debug CkWebSocket::ckLastErrorText(ws)
CkRest::ckDispose(rest)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndIf
; Add the standard WebSocket open handshake headers that will be needed.
; (This adds the required HTTP request headers to the rest object.)
CkWebSocket::ckAddClientHeaders(ws)
; Now send the GET request to /websockets.
responseBody.s = CkRest::ckFullRequestNoBody(rest,"GET","/websockets")
If CkRest::ckLastMethodSuccess(rest) <> 1
Debug CkRest::ckLastErrorText(rest)
CkRest::ckDispose(rest)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndIf
; 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.i = CkRest::ckResponseStatusCode(rest)
Debug "Response status code: " + Str(statusCode)
If statusCode <> 101
Debug responseBody
Debug "-- Failed because of unexpected response status code."
CkRest::ckDispose(rest)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndIf
; We have the expected 101 response, so let's now validate the
; contents of the response.
success = CkWebSocket::ckValidateServerHandshake(ws)
If success <> 1
Debug CkWebSocket::ckLastErrorText(ws)
CkRest::ckDispose(rest)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndIf
Debug "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.i = 1
success = CkWebSocket::ckSendFrame(ws,"http.controller_login:username=xxx&password=xxxxx",finalFrame)
If success <> 1
Debug CkWebSocket::ckLastErrorText(ws)
CkRest::ckDispose(rest)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndIf
; Read an incoming frame.
success = CkWebSocket::ckReadFrame(ws)
If success <> 1
Debug "Failed to receive a frame"
Debug "ReadFrame fail reason = " + Str(CkWebSocket::ckReadFrameFailReason(ws))
Debug CkWebSocket::ckLastErrorText(ws)
CkRest::ckDispose(rest)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndIf
; Show the string that was received.
receivedStr.s = CkWebSocket::ckGetFrameData(ws)
Debug "Received: " + receivedStr
; Continue with whatever additional communications are desired...
; ....
;
CkRest::ckDispose(rest)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndProcedure