KSP:用Koodoo语言来做web服务器脚本

缘起: KSP是什么?

KSP是Koodoo语言服务器页面脚本(Koodoo Server Page)的简称,我们知道Koodoo语言是运行在蓝星际语音平台上, 用来开发语音IVR或呼叫中心流程的高级脚本语言,直接被语音平台加载运行在线路上。而KSP却是把Koodoo语言嵌入 在HTML页面上,就像ASP、JSP或PHP一样,可以用来实现基于Web应用的业务逻辑。 我们知道,运行ASP需要IIS,PHP需要Apache,JSP则需要Java的应用服务器,那么运行KSP的web服务器是什么? 其实就是蓝星际语音平台,当然,还需要在虚拟线路上加载处理页面的脚本,具体在后面“怎么部署”详细讲述。 这是一段最简单的KSP页面(文件名Hello.ksp):

如果运行起了语音平台后,在浏览器的地址栏输入: http://localhost:8081/hello.ksp, 将会显示:

	Hello World
	Hello, KSP!
	格林维茨时间: Tue, 21 Aug 2007 09:06:21 GMT

这看起来多么简单,和其它脚本语言一样,KSP只是在普通的HTML或XHTML文件中用<% ... %>括起来的部分, Print(s)函数会将变量输出到浏览器页面上。

服务器脚本够多了,为什么还要KSP?

web服务器的脚本很多,如PHP就很好,ASP.NET也不错,JSP甚至现在流行的RoR,都有很多成熟的应用。 但KSP比他们简单,简单就是最大的优势。你不用学习和理解面向对象的概念,语法上也很简单,比如变量不用像PHP那样要 在前面弄个美元符号。此外很多朋友已经熟悉Koodoo语言了,驾轻就熟,做一些简单的业务开发没必要再用其他的工具。

KSP就运行在蓝星际语音平台上面,只是多配置几条虚拟线路来跑Web服务器而已,和语音平台紧密集成,你可以通过浏览器 来直接查询甚至控制语音平台。从某种意义上,相当于多了一个和语音平台打交道的接口。

因为KSP基于Koodoo语言,所以继承了Koodoo语言的灵活性,比如,可以利用文本转语音的函数进行实时转换并下载,可以 实时传真转换并发送传真,可以利用DLL来进行短信收发,可以给其它线路发送消息等等。

怎么部署?

点击下面的链接下载:最新的蓝星际语音平台之开发平台最新的蓝星际语音平台之运行平台

点击下面的链接下载:web服务器脚本

服务器脚本下载到本地目录后,按目录解包,将语音平台(开发平台或运行平台)程序拷贝到该工作目录。
1.如果你有运行平台许可,则简单配置好BsTelRun.cfg文件后,直接运行运行平台程序就可以了。
2.如果用开发平台来进行测试,则运行开发平台程序,选择HttpServer.bss脚本,编译,运行,为了加快速度, 去掉界面上的"动态刷新"。
注意,运行平台采用多线程方式响应浏览器的请求,有更好的性能;开发平台则采用堵塞方式运行,完成一个请求后才能 响应下一个请求,但你一个人测试就没有问题。

工作目录下有个web.ini文件,是个简单的配置文件,只有几行:

	const WEB_PORT = 8081;  // 本web服务器侦听的端口号, 为了不和标准web服务器的80端口冲突,设置为8081
	const BASE_HTM_PATH = "./Ksp/";  // 首页路径,.htm或.ksp文件放在这个目录下面,可以有子目录
	const TEMP_FILE_PATH = "tmp/";   // 临时文件路径, 必须预先创建

运行起来后,就像前面所说的,在浏览器的地址栏上输入http://localhost:8081/hello.ksp,就可以看到结果了。

解说一下: 用一百多行Koodoo代码如何实现一个功能强大的Web服务器?

其实要做一个web服务器比想像的简单,用Koodoo语言来实现就更简单了。 你可以用记事本打开HttpServer.bss脚本, 运行平台使用HttpServerCtrl.bss和HttpServerProc.bss,前者是主控脚本, 运行在一条虚拟线路上,接受浏览器的Http连接;后者分解请求并进行处理然后发送Http响应,可配置在多条虚拟线路 上运行。

脚本很简单,总共只有将近200行代码:
1.在脚本的开始,用系统函数HttpServerOpen()侦听WEB_PORT端口;
2.用系统函数HttpServerRecv()函数接收浏览器的请求;
3.调用自定义函数ProceData()处理请求的数据,在函数内会调用系统函数HttpServerSend()给浏览器发送响应数据;
4.循环2,3
自定义函数ProceData()是数据处理的关键:
1.分解请求头,取得Get、Post、Cookie等数据;
2.如果不是.ksp脚本,如普通的.htm或jpg图片等,直接打开文件发送给浏览器;
3.如果是.ksp脚本请求,则调用KspToBss()系统函数,将Ksp脚本分解为标准Koodoo语言的Bss脚本, 然后调用系统函数RunBss()执行之; 将执行脚本所生成的htm文件发送给浏览器。

这一切,都在HttpServer.bss脚本中写的明明白白,你可以自己阅读或者修改它,来适应你自己的特殊需求。你可以定制 一个Web服务器,这一切都是透明的,不是吗?

怎么用KSP?

KSP就是嵌入式的Koodoo语言,比Asp和PHP都要简单,更不用说Jsp了。 浏览器可以用Get参数或Post方法给KSP传递数据,这些存储在全局数组里面:

	_GET     // 用Get方法发送给服务器的数据
	_POST    // 用Post方法发送给服务器的数据
	_COOKIE  // 包含在客户计算机上的Cookie中的数据

这些数组可以用类似for( name in _POST )的方法遍历,也可以用下标直接访问,非常方便。

关于Cookie:
Cookie可以保存用户的信息,首先要设置它,KSP没有提供系统函数,你可以用下面的自定义函数来完成:

_headStr = ""; // 定义一个全局变量
// 自定义函数,设置一个Cookie
// 参数: name - cookie名字
//       val - coocie的值
//       expires - 有效时间,如传入NULL,表示不指定,关闭浏览器后自动失效
//       path - coockie的有效范围
function SetCookie(name, val, expires, path)
{
  vStr = "";
  StrToUnicode(val, 3, vStr);
  expStr = "";
  if( expires!=NULL )
     GetDateStr("expires=%a, %d-%b-%Y %T GMT; ", expires, true, expStr);

  pStr = "";
  if( path!=NULL || path!="" )
     pStr = "path="+path;
 
  _headStr = _headStr + "Set-Cookie: " + name + "=" + vStr + "; " + expStr + "\r\n";
  SetShareMem(_lineNo, "_RawHead", _headStr);
}

  // 试验一下
  t = Time();  // 取得当前时间
  SetCookie("user_id", "123456", t+3600, "/");     // 有效期为一个小时
  SetCookie("user_pwd", "189823", t+3600*24, "/"); // 有效期为一天
  SetCookie("user_name", "bluesen", NULL, "/"); // 有效期为本浏览器

在下一个页面中,则可以这样来取得Cookie数据:

  userId = _COOKIE["user_id"];  // 这个值是上次设置的"123456"
  userPwd = _COOKIE["user_pwd"];  // 这个值是上次设置的"189823"

... 然后到数据库进行身份校验。对_GET和_POST数据的处理是类似的。 你如果熟悉PHP,会发现KSP对Cookie的处理和PHP如出一辙,相当简单。

其实,KSP只需要处理业务逻辑,比如存取数据库,调用外部Dll函数,记录服务器日志,等等。界面的表现 部分通常用XHTML+CSS来完成。足以简单而清晰地构建Web业务系统,尤其是和语音系统结合的web业务处理系统。