IM给用户提供的主要交互方式是文字和图片,但是我逐渐感觉到这种简单的“你一言我一语”的方式不够满足高效率交流的要求。比如最近在淘宝上买东西,在用IM向卖家询问的过程中,我意识到卖家可能会处理大量的类似的询问,如果允许卖家在一定程度上将这个应答过程自动化就好了。所以我想,应该给IM增加像动态HTML中的form一样的功能,即一端让令一端填写一张预先设计好的form,对方填写好以后,一段脚本程序根据对方填写的内容做出一些动作。于是我就制作了这个验证概念的IM的程序,实现了上述两个功能--发送form和根据填写结果允许脚本。
首先说明因为这是一个“验证概念”程序,为了快速实现,这个IM的结构是这样的:与正常IM的peer-to-peer不同,这个IM中交谈的双方中一方使用浏览器最客户端,我称其为client side,一方运行着http服务器,交谈的界面用WinForm生成,称为service side。client side上的网页用ajax的方式周期性的轮流服务器。交谈过程中的界面是这样的:
client side和service side的不同之处在于:service side可以发送form到client side,然后用程序处理client side填写后发回的内容,要使用这种功能,service side需先用xml定义form和根据反馈执行的程序,以下是一个例子:
2 <script>
3 <form name="form1">
4 <radio name="purpose">
5 <item id="talk">我想和你聊天</item>
6 <item id="soy">我要采购酱油的</item>
7 </radio>
8 </form>
9
10 <form name="form2">
11 <textarea name="resume"></textarea>
12 <checkbox name="beauty">我是美女</checkbox>
13 </form>
14
15 <form name="form3">
16 <select name="soytype">
17 <item id="light">生抽</item>
18 <item id="dark">老抽</item>
19 </select>
20 <text name="weight"></text>
21 </form>
22
23 <process>
24 <![CDATA[
25 form1 feedback1 = GetFeedbackFrom_form1();
26 if (feedback1.purpose.talk) {
27 form2 feedback2 = GetFeedbackFrom_form2();
28 if (feedback2.beauty) {
29 ShowFeedback(feedback2);
30 } else {
31 throw new Exception("dragon");
32 }
33 } else {
34 form3 soytype = GetFeedbackFrom_form3();
35 ShowFeedback(soytype);
36 StartTalk();
37 }
38 ]]>
39 </process>
40 </script>
form1的意思是这个form包含一组radio,让form接收者(client side)在“聊天”和“打酱油”中做出选择。form2包含一个文本框和一个选项。form3包含一个选择酱油类型的下拉式菜单和一个文本框。<process>元素包含要执行的程序,用C#编写。假设前面定义了一个名为MyForm的form:
</form>
要向对方(client side)发送这个form时,就调用函数GetFeedbackFrom_MyForm,对方填写表格并提交后,该函数返回一个类型为MyForm的对象,这个对象储存了对方在form中填写了内容,比如,如果MyForm中包含一个名为checked的checkbox元素:
<checkbox name="checked">打个勾勾吧</checkbox>
</form>
那么MyForm类就包含一个checked的bool成员变量,它的值反映了对方是否在这个checkbox上打勾。类似的,form中的<textarea>和<text>会生成同名的string变量,储存对方填写的内容。
假设这个文件叫myscript.xml,用automation.exe编译它,输出到myscript文件夹:
打开myscript文件夹,其中有文件form1.htm,form2.htm,form3.htm和process.dll,分别对应script.xml中定义的3个form和<process>中的程序。现在可以修改生成的HTML文件,加入提示,图片,样式等等,但不要改变automation.exe生成的HTML form的基本结构(不要增减form中的输入元素,不要改变name、value属性的值)。美工的工作完成后,就可以运行IM了:
然后试验一下效果。在浏览器中打开http://127.0.0.1/index.htm,出现界面,点击Connect按钮,刹那间,script.xml中第3行中定义的form1出现在client side:
选择酱油,然后提交查询,service side端执行script.xml第26行。因为我们没有选择聊天,所以feedback1.purpose.talk为false(而feedback.purpose.soy为true),程序跳转到33行,form3,也就是酱油类型选择出现在client side:
选择一种酱油,在框中输入“80kg” ,提交,script.xml执行35、36行。当service side的用户程序调用StarkTalk的时候,表示开始人和人的交谈,即正常IM的运行模式,这时service side界面弹出,用户在form中填写的内容显示出来:
这个简单的程序就介绍完了,最后也故作深沉的来点思想。我认为IM不仅可以做交谈工具,还有成为简单的信息发布手段的潜能。为什么不用web站点呢?因为总的来说建设一个web站是很复杂的,asp.net、Django、Ruby of rails...这些工具都不是一两天学得会的,而且每次要使用都有较高的起始成本。web站点的特点是:比较正式,有很高的availability(24小时都能访问),容许许多人同时访问,无限的功能(只要是html、javascript、http能实现的都可以实现)。有的时候我们只要临时的发布一些简单的信息,和别人进行一些简单的互动,没有对web站点功能的要求,能不能使用IM+脚本的方式呢?