最近写了一个tcltk的rpc脚本,用来远程执行tcl脚本。基本上的思路就是,客户端发出一连串的脚本命令,只要是tcl的都行,函数啊什么的;服务
器端接受后,检测一下,没有语法错误的话,就把运行结果返回给客户端,同时清空缓冲区并等待接下来接收的命令。具体的解释以后再说,也可能不写了。我的想
法是把这个脚本安在一个服务器上,作为一个以tcl脚本为基础的通用服务,执行来自不同客户端的各个任务。
大抵这种两端跑的程序,写的时候没什么,测试的时候就颇为麻烦了。开两个cmd,一边一个server,另一边client,完了为了停下来还得两头按
Control-C,真是一个手忙脚乱啊!
我想这样的测试,一般都是起了服务端,再客户端发一些命令,然后看接受效果就差不多了。完全可以搞在一起,把测试弄成一个脚本来执行,完了一起退出。当然
服务器端脚本和客户端脚本要在不同的环境中运行。这里有两个选择,要么建两个interp,要么用多线程。前段时间用interp用得有点腻味,包括这个
rpc脚本也是用interp来处理不同的客户端连接的,所以这次换用多线程。具体的脚本如下,存为test_in_thread.tcl文件:
package require Thread
package require ltools
foreach file $argv command {server_commands client_commands} {
set $command "source $file"
}
set serv_thread [thread::create $server_commands]
set cli_thread [thread::create $client_commands]
after 5000 {
leach [list $::cli_thread $::serv_thread] [@ {thread} {
thread::release $thread
}]
set delay 1
}
vwait delay
其实很简单,执行的参数包含两个脚本名,分别是服务器端和客户端的;接着,起两个线程,程序等待在delay变量上,5秒之后重设delay并完成退出。
这样以后测试socket程序就方便多了。如上面说的rpc程序,写完之后运行:tcl86 test_in_thread.tcl rpc.tcl
rpc_test.tcl,看看结果就行了。
附件下载