Sample code for 30+ languages & platforms
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

PureBasic
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