我正在使用tcl和tk关注实际编程的echo服务示例,并且我有一些问题(在tcl中)关于基于该代码实现一些额外的东西。
我试图每隔30秒向所有客户端发送一条消息。我正在使用wiki http://wiki.tcl.tk/9299中定义的“每个”程序,“要限制重复次数,请使用return:[...]”。一旦用户离开服务器(通过关闭套接字),每个函数仍然运行,我收到错误消息。如何检查套接字是否仍然打开,如果不是,我会停止发送消息?
答案 0 :(得分:1)
every
脚本非常简单,因为它没有提供取消重复的简单机制。但是,您使用的版本非常简单,可以很好地处理终止事务。您必须抓住错误(来自已关闭的频道)并通过return
响应,这会阻止after
被使用。
proc every {ms body} {
eval $body
after $ms [info level 0]
}
every 30000 {
if {[catch {
puts $::channel "Hi there!"
}]} return
}
使用帮助程序和使用list
生成的回调技术这样做可能更好,这可以触及Tcl的一些更高级的功能:
proc every {ms body} {
eval $body
after $ms [info level 0]
}
proc sendThePing {channel} {
if {[catch {
puts $channel "Hi there!"
}]} {
# Make the _caller_ (every) return!
return -level 2 done
}
}
every 30000 [list sendThePing $theChannel]
这更适合处理多个连接,更复杂的参数传递等等。