Kotak websocket uses Socket.IO server
Socket.io is a multi chat/bi-directional communication system built on the top of raw websockets (it's also supports HTTP long-polling).
Python and Js clients are available for socket.io, but neither DotNet client nor any getting started article available for DotNet!?.
If you try send message to socket.io server from any .Net websocket clients, mostly you won't get any response.
This is because the socket.io server expects messages to be sent in certain format (socket.io protocol). Check this below link for socket.io protocol.
https://github.com/socketio/socket.io-protocol
Kotak's offcial documentaion has example in Js which uses socket.io, so anyone trying to connect using raw websocket client might have failed to make it work.
Check the Kotak's js websocket documentation here.
Let's get started
Connection:
Js Example:
<script>const socket = io("https://wstreamer.kotaksecurities.com?access_token=a38b95f878c52eer4037ioa8d0456l12c12e2efff7", { path: "/feed/", transports: ['websocket', 'polling'] });</script>
Raw Websocket:
Here the path argument has to be included in the Url
websocket = new Websocket("wss://wstreamer.kotaksecurities.com/feed/?EIO=3&transport=websocket&access_token=a38b95f878c52eer4037ioa8d0456l12c12e2efff7")
*EIO=3 is the socket.io engine version used in Kotak server
*Also note the url scheme in Js (https://) and in raw socket (wss://)
Subscribe for Quotes:
Js Example:
<script>socket.emit('pageload', "{'inputtoken', 'insttoken'}"); </script>
Raw Websocket:
Here we need to send the message with prefix 42
42["pageload", {"inputtoken":"insttoken"}]
WebSocket.Send("42[" & """" & "pageload" & """" & ", {" & """" & "inputtoken" & """" & ":" & """" & insttoken & """" & "}]")
*for multiple tokens send insttoken as csv token1,token2,token3
Unsubscribe is same as above except change "pageload" to "pageunload"
Other points:
Socket.io server expects a ping message from the client every 25 seconds else, it will disconnect.
For safer side send ping every 10 secs from websocket client. The following is accepted as Ping by socket.io
WebSocket.Send("3")
There are delays in connection at sometimes that we reported to Kotak team.
You have to send message only after you receive welcome message from socket.io server.
Kotak socket sends the welcome message as "broadcast" event at sometime and "message" event at some other times.
You will be able to subscribe and receive quotes if the welcome message is sent us "message" from kotak socket.
If the welcome message is received as "broadcast", disconnect and connect gain with socket.io server.
Sample messages received from socket.io on connect
400{"sid":"bRapKCZCWDMNT 2_AAen","upgrades":[],"pingInterval":25000,"pingTimeout":5000}42["broadcast", "welcome to Streamer Io (Build: 20201120).")
400{"sid":"_QmZIS7Diwsp459VAAEq", "upgrades":[],"pingInterval":25000,"pingTimeout":5000}42["message","welcome to Streamer IO (Build: 20200709). ")
Full Example using Websocket4Net:
Module KotakSocket
'''
''' Basic Example
''' Modify as required
''' Add error handling
'''
Private Websock As WebSocket
Sub main()
Dim ConsumerKey As String = "xxxxxxx"
Dim ConsumerSecret As String = "yyyyyy"
Dim token As String = GetTokenWebSock(ConsumerKey, ConsumerSecret)
If Not String.IsNullOrEmpty(token) Then
Connect(token)
'//Start the Ping loop after successful connect
End If
Console.ReadKey()
End Sub
Private Function GetTokenWebSock(ByVal ConsumerKey As String, ByVal ConsumerSecret As String) As String
Try
Dim auth As String = ConsumerKey & ":" & ConsumerSecret
Dim authBase64 As String = Convert.ToBase64String(Encoding.UTF8.GetBytes(auth))
Dim json As String = "{" & """" & "authentication" & """" & ": " & """" & authBase64 & """" & "}"
Using client As New WebClient
client.Headers(HttpRequestHeader.ContentType) = "application/json"
Dim postBytes As Byte() = Encoding.ASCII.GetBytes(json)
Dim respBytes As Byte() = client.UploadData("https://wstreamer.kotaksecurities.com/feed/auth/token", "POST", postBytes)
Dim respString As String = Encoding.ASCII.GetString(respBytes)
Dim token As String '= //parse the json response with json client and extract the token
Return token
End Using
Catch Ex As Exception
End Try
Return ""
End Function
Private Sub Connect(ByVal tokenWebsock As String)
Websock = New WebSocket("wss://wstreamer.kotaksecurities.com" & "/feed/?EIO=3&transport=websocket&access_token=" & _
tokenWebsock, "", WebSocketVersion.Rfc6455)
Websock.Security.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12 '//Onll Tls2 supported by Kotak
'AddHandler
AddHandler Websock.Opened, AddressOf WebSockOpened
AddHandler Websock.Closed, AddressOf WebSockClosed
AddHandler Websock.MessageReceived, AddressOf WebSockMessageReceived
AddHandler Websock.Error, AddressOf WebSockError
Websock.Open()
End Sub
Private Sub WebSockOpened(sender As Object, e As System.EventArgs)
Console.WriteLine("socket opened")
End Sub
Private Sub WebSockMessageReceived(sender As Object, e As WebSocket4Net.MessageReceivedEventArgs)
Console.WriteLine("message received from socket: " & e.Message)
'//Do data parsing here
End Sub
Private Sub WebSockClosed(sender As Object, e As System.EventArgs)
Console.WriteLine("socket closed")
'//Do retry logic here
End Sub
Private Sub WebSockError(sender As Object, e As SuperSocket.ClientEngine.ErrorEventArgs)
Console.WriteLine("socket error: " & e.Exception.Message)
'//Do retry logic here
End Sub
Private Sub PingWebsocket()
Do
Thread.Sleep(10000) 'CHECK
If Websock Is Nothing Then Continue Do
Websock.Send("3")
Loop
End Sub
End Module
References:
https://stackoverflow.com/questions/24564877/what-do-these-numbers-mean-in-socket-io-payload