1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
#!/bin/env tclsh
# Example websocket server from anonymous user at
# https://core.tcl-lang.org/tcllib/tktview?name=0dd2a66f08
package require websocket
::websocket::loglevel debug
set srvSock [socket -server handleConnect 8080]
# 1. declare the (tcp) server-socket as a websocket server
::websocket::server $srvSock
# 2. register callback
::websocket::live $srvSock / wsLiveCB
# the usual tcl-tcp stuff (I don't (want to) use an http server package)
proc handleConnect {client_socket IP_address port} {
puts "handleConnect"
puts "============="
puts "IP_address: $IP_address"
puts "port: $port\n"
fileevent $client_socket readable [list handleRead $client_socket]
}
proc handleRead {client_socket} {
global srvSock
chan configure $client_socket -translation crlf
set hdrs {}
gets $client_socket line
puts "HTTP HEADERS"
puts "============"
puts $line
while {[gets $client_socket header_line]>=0 && $header_line ne ""} {
puts $header_line
if {[regexp -expanded {^( [^\s:]+ ) \s* : \s* (.+)} $header_line -> header_name header_value]} {
lappend hdrs $header_name $header_value
} else {
break
}
}
puts "\n"
# Now have the HTTP GET headers
# 3. let's check valid
if {[::websocket::test $srvSock $client_socket / $hdrs]} {
puts "Incoming websocket connection received"
# 4. upgrade the socket
::websocket::upgrade $client_socket
# from now the wsLiveCB will be called (not anymore handleRead).
} else {
close $client_socket
}
}
proc wsLiveCB {client_socket type_of_event data_received} {
puts "
inside wsLiveCB handler
=======================
client_socket: $client_socket
type_of_event: $type_of_event
data_received: $data_received\n"
switch $type_of_event {
connect { }
disconnect { }
text {
::websocket::send $client_socket text "The server received '$data_received'"
}
binary {}
error {}
close { }
timeout { }
ping {}
pong {}
}
}
vwait forever
|