1、大型主机应用上的开放系统和中间件,第7章 应用CICS Web Support实现以IP直连访问主机应用,CICS Web Support(简称CWS)提供了一些CICS的服务,使得用户可以通过浏览器的方式直接调用和访问CICS中的应用。用户可以使用CICS Web Support中Web-aware程序来处理Web的请求与响应。Web-aware程序指的是使用CICS Web Support提供的Web API,例如EXEC CICS WEB和EXEC CICS DOCUMENT,来处理Web请求与响应的程序。应用程序可以使用CICS Web Support完成如下一些功能:1.通过匹配请求
2、的URL来调用相应的CICS应用;2.解析HTTP请求;3.构建HTTP响应;4.构建显示在浏览器上的HTML输出文本。尽管CICS Web Support主要是设计用来支持通过HTTP浏览器和CICS的交互,但是它同样支持客户端的非HTTP(non-Http)的请求,例如用socket发来的数据包。但是不论何种情况,CICS Web Support都会使用相同的资源组件来处理以上的两种请求。,7.1 CICS Web Support概述7.1.1 为什么要使用CICS Web Support,CICS Web Support是CICS本身自带的处理TCP/IP请求与响应的服务,它提供客户端通
3、过IP直连的方式对CICS进行访问。对于浏览器使用HTTP的通讯方式,而Socket使用非HTTP的通讯方式。它不需要用户通过添加任何中间的连接桥(比如CTG,MQ)或者Web Server来接入CICS。对于用户来说它们可以开发基于HTML页面的应用,提供友好的用户操作界面(CICS Plex Manager的Web User Interface就是基于此项技术的实现),或者使用非HTTP的方式,直接向CICS发送TCP数据包,在Web请求处理方面也有很大的灵活性。如果安装Web Server或者CTG就需要增加额外的维护工作,但在CICS Web Support中,用户完全可以通过其提供的
4、API来灵活处理TCP/IP请求。,7.1.2 CICS Web Support中的组件,CICS Web Support包含了如下组件:1.EXEC CICS WEB API也称为CICS Web Interface,用来解析HTTP请求和构建HTTP响应,同时EXEC CICS WEB 中的一些API也可以处理非HTTP的请求。2.EXEC CICS DOCUMENT API。通过HTML模板用来构建HTML文本,用于浏览器的显示。3.文档模板(Document Template)。通过HTML代码片段来构建HTML文本,其中用到一些符号列表,在将HTML发送给浏览器的时候动态地替换符号的
5、内容。4.数据转换程序(Data Conversion Program)。CICS提供的转码程序DFHCCNV,当浏览器与CICS使用不同的Code Page时对数据进行正确的转换。5.BMS宏。可以将BMS Map转化成HTML文本。6.Utility程序。处理HTTP的请求与响应。绝大多数都是系统程序,对于用户是透明的。例如,Web Attach程序,Alias Transaction程序等等。,7.1.3 Business Logic Interface,Business Logic Interface 简称BLI。BLI是CICS Web Support中的Web组件同User Pro
6、gram通信的接口。BLI可以将对Web请求的处理与业务逻辑的处理分隔开来。BLI的分层结构图如下图7-1所示:在BLI模型中Converter负责处理Web请求和响应的数据。Converter分为两部分,第一部分处理Inbound数据(decode),将请求数据转化为Business Logic程序(也称作User Program或者Server Program)可识别的数据结构。Business Logic程序将COMMAREA的数据传回给Converter。Converter将此数据转化为响应数据(encode)。,图7-1: BLI分层结构图,在CWS中BLI的程序DFHWBBLI被A
7、nalyzer调用,Analyzer在稍后讲到。DFHWBBLI的COMMAREA中可以指定Converter的名字,User Program的名字,和Decode的数据。如果Analyzer指定Converter的名字,则BLI会调用Converter。Decode会为User Program设置COMMAREA的数据结构,然后返回BLI。随后BLI会调用User Program将COMMAREA数据传递给User Program。如果不指定Converter的话,BLI则将请求的数据原封不动的传递给User Program,由User Program自己处理。User Program会更新
8、COMMAREA。最后如果指定了Converter,BLI会调用Converter做Encode对客户端做出响应。这里需要说明的是:BLI模型在CWS中被称为non Web-aware模型。也就是说处理请求的数据是从COMMAREA中获得,但是CWS中可以用Web API直接得到请求数据,并且解析请求数据。但是这对HTTP的请求来说是可行的,对于非HTTP的请求则不行,处理非HTTP请求我们需要从COMMAREA中取得请求数据,然后自己做解析,这在下边的非HTTP处理中会讲到。,BLI可以以CICS LINK、DPL或者EXCI的方式被调用。在CWS中Analyzer会以CICS LINK的方
9、式调用BLI。以CICS LINK和DPL方式调用BLI的图例如下图7-2所示:外部程序以EXCI方式调用BLI的图例如下图7-3所示:,图7-2:CICS中以LINK和DPL方式调用BLI,图7-3:外部程序以EXCI方式调用BLI,7.2 CICS Web Support对HTTP请求的处理7.2.1 CICS如何处理HTTP的请求,当CICS接收到浏览器发来的HTTP请求时,CICS Web Support会启动一系列的处理流程,然后再调用CICS的应用程序。以下是CICS Web Support处理HTTP请求的基本流程:1.接受TCP/IP连接CICS通过Socket接受TCP/IP
10、的连接请求。CICS的Socket Domain将TCP/IP的请求派发给CICS Web Support Service来做进一步的处理。CICS Socket Domain会启动一个长时间运行的Socket监听任务,监听任务会监听所有定义在CICS端口上的TCP/IP连接请求。当请求服务为CICS Web Support时,监听器会自动绑定Web Attach Task(Web Attach Task后面会讲到),在一个CICS Region中只有一个Socket监听任务的实例。2.HTTP头的转码从浏览器接收来的HTTP头的字符集通常为ASCII Latin-1(Code Page IS
11、O 8859-1)。它们会被转换成主机使用的字符集EBCDIC(Code Page 037)。当每一个HTTP请求到来时都会做这种字符集的转换。,3.分析请求HTTP请求、HTTP头、HTTP Body都会传入Analyzer Program。Analyzer Program主要负责解析请求(包括URL的解析),来决定:(1)需要哪一种CICS资源来处理请求;(2)请求数据将做什么样的代码页的转换;(3)下边还需要哪些步骤来处理请求。对于每一个HTTP请求都会调用Analyzer。4.HTTP Body的转码接收到的HTTP Body的Code Page是浏览器的Code Page。用户可以选
12、择将数据转换成自身应用程序的Code Page。如果在Analyzer设置Body的转码,这一步的转化对于每一个HTTP的请求执行一次。这一步不是必须的,用户可以在Web-aware程序中使用CICS WEB API来自动做转码工作。,5.构建CICS应用程序的输入从浏览器接收到的HTTP的请求数据可能不符合下面应用程序(Non-Web Aware程序)所要求的数据格式。这时用户可以用Converter程序对HTTP请求进行Decode,构建符合应用程序要求的输入数据。但是对于Web-aware程序来说并不需要Converter来构建应用程序的输入,对于HTTP的请求WEB API会自动提取用
13、户所需的数据域,比如,Http Header、Http Body、Form Field等。6.执行CICS应用程序在多数情况下Analyzer和Converter会调用一个CICS应用程序来执行,并且构建这个程序的输入数据。7.构建HTTP的输出响应应用程序的输出可能并不是发送到浏览器中的正确的数据格式。这时用户可以用Converter将数据做Encode作为HTTP的响应。同样的,对于Web-aware程序不需要Converter来构建HTTP的输出响应。用WEB API和DOCUMENT API可以完成此工作。,8.HTTP响应的转码HTTP的响应使用的是应用程序的Code Page。可能
14、需要将响应数据转换成浏览器支持的Code Page。当Analyzer中指定了Code Page转换时这一步会被执行。对于Web-aware程序可以用WEB API做Code Page的转换。9.发送HTTP响应进行完上述的处理流程后,CICS Socket Domain会将HTTP响应发给浏览器。下图7-4是对处理HTTP请求时需要用到的CISC Web Support资源的描述,圈起来的部分表示了处理HTTP请求时资源的调用顺序,在下边的小节中会对这些资源加以阐述。,图7-4:CICS Web Support处理HTTP请求时需要的资源,7.2.2 CICS Web绑定处理,1. List
15、ener Transaction CWXNCICS Web Support可以同时监听多个TCP/IP端口。Socket Listener Transaction CSOL负责监听每一个定义在TCPIPSERVICE中的端口。TCPIPSERVICE作为CICS提供的资源组件负责对监听器进行管理。TCPIPSERVICE封装了一个TCP/IP监听器的功能。尽管Socket Domain只有一个监听任务,但是使用多个TCPIPSERVICE,使得CICS可以在同一时间监听不同端口、IP地址上的多种请求。换句话说Socket Listener Task CSOL可以处理TCPIPSERVICE中定
16、义的监听Socket。TCPIPSERVICE只负责处理应用TCP/IP协议的请求,因此它必须依赖通过CICS的Socket Domain同客户端进行通信。但是并不是所有的TCPIPSERVICE都和HTTP请求绑定,TCPIPSERVICE还可以处理IIOP,或者non-Http请求等。Socket接收到它监听端口上的连接请求时,CSOL会绑定一个Transaction,这个Transaction和此端口对应的TCPIPSERVICE相关联。,对于处理Web请求的TCPIPSERVICE,默认绑定的Task是CWXN(非HTTP的请求是CWXU,下面小节将会讲到非HTTP请求的处理)。CWX
17、N是一个系统任务,它会建立Alias Transaction的上下文,Alias Transaction则负责处理请求。在一个CICS Region中可以有多个CWXN的运行实例,对于每一个请求都会绑定一个CWXN的实例来处理。同时CWXN也会启动多个Alias Transaction来处理请求。当Socket 监听程序 DFHSOL调用DFHWBXN时,DFHWBXN会调用内部的Web Receive Call来接收Socket监听器接收来的客户端的数据。当收到数据以后,数据被写入TS Queue中。一共有两个TS Queue用来存放请求的数据。第一个TS Queue用来存放HTTP Hea
18、der数据,并且数据是以EBCDIC形式存放的。在将HTTP Header写入TS Queue以前将调用Code Page转化程序DFHCCNV将ACCII码转化成EBCDIC码。而第二个TS Queue用来存放HTTP请求的Body数据。这里的数据将不做Code Page的转换,因为Body的数据需要用户自己决定如何处理。可能在Analyzer中指定Code Page,User Program 通过BLI COMMAREA得到数据,或者对于Web-aware程序,用户用WEB API来自己做Code Page的转码工作。,当所有的数据被写到TS Queue以后,Analyzer Progra
19、m被调用来建立Alias Transaction,User Program会在Alias Transaction下执行。如果请求数据没有包含“Connection: Keep-Alive”的头部,CWXN在调用完Analyzer后就被中止执行。如果HTTP的会话是长连接的,CWXN会被暂时挂起,直到Alias Transaction执行完以后,再被重新执行。这时它会重新进行内部的Web Receive Call看看是否有更多的请求数据从Socket发过来。2. Alias Transaction CWBA用户的Web请求最终在CICS被执行需要通过Alias Transaction。一个Ali
20、as Transaction只能执行单一的请求,但是CWXN可以同时启动多个Alias Transaction,每一个对应处理一个请求。CWBA是系统默认的Alias Transaction ID,它会调用系统程序DFHWBA。Transaction ID可以被用户在Analyzer中更改,但是初始调用的程序总会是DFHWBA。DFHWBA会调用BLI程序DFHWBBLI。DFHWBBLI会调用Converter 和User Program来完成Web请求的处理。,7.2.3 CICS Web Support Analyzer,Analyzer是一个User-Replaceable(URM)P
21、rogram,它负责解析每一个从浏览器到来的请求,它会决定:1.HTTP在CICS中是否被处理;2.调用哪一种相应的CICS资源来处理HTTP请求;3.以下HTTP的处理流程。Analyzer可以指定处理HTTP请求的CICS应用程序的名字,Converter的名字,Alias Transaction ID,执行Alias Transaction的USER ID,Code Page的转换。Analyzer在TCPIPSERVICE的URM参数中指定。因为Analyzer是系统调用的,在定义Analyzer时需要指定ExecKey为CICS。Analyzer在CWXN收到Listener Tra
22、nsaction的请求数据后被调用。,Analyzer按照如下的格式解析HTTP请求的URL:所有的数据域在解析的时候都被转为大写。1.converter。指明了处理请求的Converter的名字,最多8个字符。如果设定Converter的名称为“CICS”,则说明没有Converter将被调用。2.alias。指定Alias Transaction的名字,最多4个字符。3.program。指定了处理请求的CICS应用程序的名字,最多8个字符。4.ignored。这部分数据域被Analyzer忽略,但是可以被Converter来使用。5.token。前8个字节被作为User Token传递给C
23、onverter,随后的字节被Analyzer所忽略,但是可以被Converter或者User Program所使用。,7.2.4 基于HTTP处理请求的实现,这里将给出一个具体的应用,此应用说明了如何利用CWS实现一个基于HTML的Web应用程序,以浏览器访问的方式调用CICS中的应用。1 . 应用程序架构及运行环境此应用程序是一个基于HTML Web页面的应用程序。用户可以实现登录、注册和编辑自己的注册信息的功能。Analyzer通过解析用户从浏览器输入的URL地址,调用相应的Web-Aware User Program来处理HTTP的请求与响应。同时还加入了图片处理的功能,利用Conve
24、rter处理图片的显示。同时还考虑了图片处理与消息处理的负载分配,用两个CICS Region分别处理图片和文本消息。,应用程序架构如下图7-5所示:,图7-5:应用程序架构,应用程序运行环境如下图7-6所示:在Web浏览器中键入如下格式的URL来调用CICS的Program:Http:/10.60.37.130:20003/CICS/CWBA/CWIINDEX 其中:(1)10.60.37.130 是应用程序运行的主机名或IP地址;(2)20003是TCPIPSERVICE中定义的端口号;(3)CICS是Converter的名字,这里用CICS表示不需要Converter;(4)CWBA是A
25、lias Transaction的名字;(5)CWIINDEX是Web-aware Program的名字。,2. 应用中的CICS Web Support资源(1)TCPIPSERVICE (2)Analyzer(3)User Program(4)HTML DOCUMENT TemplateDOCUMENT Template在CICS中可以以RDO的方式来定义,CICS中用专门的DOCUMENT Handler Domain来管理DOCUMENT Template。DOCUMENT Template可以存放在VSAM、TS Queue、TD Queue、DFHRPL的Load Library、
26、PDS数据集或者内存中。为了便于管理,对于较大的DOCUMENT Template一般都存放在PDS数据集中。对于用PDS数据集来存放DOCMENT Template,需要在CICS Startup JCL中指定DD语句来指定PDS数据集的位置,例如可以用如下的DD语句指定DOCUMENT Template的PDS数据集:需要说明的是对于定义DOCUMENT Template存放的形式,上面的说到的File、TS Queue等是互斥的,也就是说只能用它们中的一个来存放DOCUMENT Template。在CICS Web Support中用DOCUMENT Template来存放HTML页面的
27、模板,此模板中包含了静态的HTML页面代码和需要动态显示的符号列表,这些符号在CWS构建HTTP响应时被Web-aware程序动态地替换成HTML文本。,3. 设计Web-aware程序结构典型的Web-aware程序处理请求和响应的流程是:解析TCP/IP请求,解析HTTP请求,得到HTTP Body中的数据,抽取HTML Form中的数据,构建HTML模板,替换模板中符号列表的符号值,构建相应的HTML文本,对客户端做出响应。Web-aware程序的程序结构图如下图7-7所示:,图7-7:Web-aware程序的程序结构,4. 应用中的CICS Web Support APICICS We
28、b Support API一共有三类:TCP/IP API,WEB API,DOCUMENT API。这里只对应用中的API做一下介绍。 (1)TCP/IP APIWEB程序或者IIOP程序可以通过TCP/IP API获得关于客户端和服务端的TCP/IP信息。API如下:(2)WEB APIWEB程序可以通过WEB API处理HTTP请求和响应。1)获得HTTP相关信息的API如下:,2)获得HTTP Header信息的API如下:3)得到Body数据(User Data)的API如下:4)发送HTTP响应,通过将DOCUMENT Template的数据转化成HTTP Body发送给客户端,A
29、PI如下:5)抽取HTML Form中的数据。由于Form存在于Body中,所以在调用此API之前必须先执行EXEC CICS WEB RECEIVE。在执行此API时,会自动根据HTML Form Field 的名字来提取相应的数据。API如下:,(3)DOCUMENT API可以通过DOCUMENT API创建和处理以多种方式储存的HTML文档,并且可以做符号替换。在介绍DOCUMENT API前先介绍符号列表(Symbol Lists)。符号列表是符号的集合,每个符号以最多可以有32个字符。可以是任意字母数字,大写或者小写或者有下划线,但是中间不能有空格。DOCUMENT API 根据传
30、入的符号列表对DOCUMENT Template做符号的替换。下图7-8是一个符号列表的例子,以及如何给符号赋值,并作符号替换。,图7-8 符号的转换,构建新的文档。可以指定以什么形式建立文档。如果从内存中建立则使用FROM参数,传入文档模板的字符串;或者指定Template参数,从文件或者Queue中构建文档。在执行此API的时候会进行模板中符号的替换。此API会返回一个DOCTOKEN,在WEB SEND API中根据DOCTOKEN来构建HTTP的响应数据。API如下:,5. 图片处理基于HTML的Web应用必然要涉及到图片的显示处理问题。在CICS Web Support中由于我们采用
31、的是IP直连的方式,无法借助HTTP Server来处理图片的显示,所以这里我们采用解析程序(Converter)来处理图片的显示。前面介绍了Analyzer如何处理解析HTTP请求的URL,根据URL的格式我们设计一个请求的字符串。在处理图片的显示时,调用Converter的同时指明我们图片的名称和扩展名。根据以上URL路径构造的一个请求的字符串:“/graphix/head.jpg”。我们指定graphix为Converter程序的名字,head为要显示的图片的名字,jpg为图片的扩展名。根据以上构想,我们要解决的问题就是:(1)Converter的调用。在Analyzer中根据请求的UR
32、L得到图片处理的Converter的名称,调用Converter,同时不需要用Alias调用User Program。,(2)图片的存储。这里我们用之前介绍的DOCUMENT TEMPLATE来存放图片。我们可以将图片以二进制格式存放到MVS的Dataset中,在定义DOCUMENT TEMPLATE时指定Type为Binary,存放的存储介质为Dataset。这里之所以选用Dataset是因为图片是一种相对较大的文件,如果以TDQ的方式存放的话,虽然会在一定程度上提高处理效率(从内存中直接读取),但容量大小不能超过32760个byte,而Dataset几乎可以存取任意大小的文件。(3)效率的
33、考虑。因为图片的处理相对页面的字符处理和请求消息的处理来说负载较大,所以这里考虑用另外一个CICS Region来单独处理图片的显示,就好像模拟一个HTTP Server一样,这样就会把图片处理与请求消息的处理分开,降低了单一CICS Region的负载,大大提高了效率。,下图7-9为负载解决方案的示意图,一共有两个CICS Region,在图片处理的CICS Region中单独定义一个TCPIPSERVICE用于图片请求的处理。,图7-9:图片处理的负载分配图,下面论述图片处理的各个步骤: (1)Analyzer中调用图片处理Converter的COBOL代码如下:(2)图片处理的Conve
34、rter的实现:1.获取HTTP请求的URL路径,例如,/graphix/head.jpg;2.根据URL路径分离图片的名称和扩展名;3.根据图片的名称建立相应的存放图片的DOCUMENT TEMPLATE;4.构建相应的HTTP Header,指定Contenttype Value为imag/扩展名;5.将建立好的存放图片的DOCUMENT TEMPLATE发给浏览器。,(3)存放图片的DOCUMENT TEMPLATE在CICS中的定义如下图7-10所示。这里 Templatename为要显示的图片名称,存放介质为PDS数据集中的Member,属性中Type为Binary。,图7-10 D
35、OCUMENT TEMPLATE在CICS中的定义,(4)图片处理CICS Region的TCPIPSERVICE的定义如下图7-11所示。这里需要指定一个和消息处理CICS Region中不同的TCPIP端口号,同时在属性URM中需要指定一个不同Analyzer来实现Converter的调用。,图7-11 TCPIPSERVICE在CICS中的定义,6. 实现场景以下是本应用实现之后的场景。用户登录主页以后可以选择注册新的用户,或者用已注册好的用户名和密码登录之后进行信息的编辑。界面如下图7-12所示:,图7-12 本应用实现之后的场景界面,7.3 CICS Web Support对非HTT
36、P请求的处理,CICS Web Support支持对非HTTP请求的处理。在一些场合中,用户的客户端程序是通过Socket同CICS进行通讯,这里并不是使用HTTP协议,仅仅是发来Socket的TCP数据包。在前面的CICS Web Support中介绍过,对于非HTTP的请求CICS Web Support仍然会使用相同的CICS资源组件对其进行处理,但是Analyzer中处理的方式将会同HTTP的有所不同,而且只支持EXEC CICS WEB SEND API用来对客户端进行请求的响应和DOCUMENT API用来构建文档,其他的WEB API将无法使用,特别是我们无法用WEB RECEI
37、VE来得到请求的数据。非HTTP的处理并不属于Web的处理,但在现实中却经常使用,比如目前的银行ATM系统或者一些3270终端的系统和远程Server的通信,它们都不会发HTTP请求的数据包。如果和CICS进行通信的话可能会使用MQ或者CTG的方式,但是这无疑增加了维护上的开销,所以应用CICS Web Support的方式可以进行TCP/IP的直连,无疑对客户来说节约了很大的成本。与HTTP处理不同的是非HTTP的处理用到的Web Attach Task是CWXU,但是它仍然会调用Web Attach程序DFHWBXN。,非HTTP请求处理调用的CWS资源组件如下图7-13所示:,CWS非H
38、TTP的处理流程图如下图7-14所示:,图7-13:非HTTP请求处理调用的CWS资源组件,图7-14:CWS非HTTP的处理流程,7.3.1 TCPIPSERVICE的定义,在TCPIPSERVICE的定义中我们将指定Protocol参数为User,Transaction为CWXU。如下图7-15所示:,图7-15 TCPIPSERVICE在CICS中的定义,7.3.2 非HTTP请求Analyzer的实现,非HTTP请求的Analyzer中将不会指定如下的输入数据域:HTTP版本MethodDocument path请求数据头请求数据会被分成几部分在网络中传输。对于非HTTP请求,CICS
39、在调用Analyzer以前将不会对请求的数据加以重构处理,例如不会将HTTP请求的数据头部和Body分开,而是原封不动的将User Data传给Analyzer。在User Data进入Analyzer的时候被拆成两部分,而每一次调用Analyzer只会收到其中的一个部分,所以我们必须连续地调用两次Analyzer才会将User Data完全地得到,随后才可以调用User Program来处理得到的User Data。,在这里我们需要在第一次调用Analyzer的时候指定Analyzer的返回码为URP_EXECPTION,Reason Code为URP_RECEIVE_OUTSTANDING
40、。这样CICS Web Support会在第一次调用Analyzer的基础上进行第二次的调用,得到User Data的另一部分。由于使用COMMAREA来获得请求数据,所以最大的字节数不能超过32767个字节。由于我们无法用WEB RECEIVE来做Code Page的转化,所以在Analyzer中我们自己做Code Page的转换。以下是Analyzer中关键技术的C语言实现代码。,7.3.3 User Program的改变应用BLI接口获得请求数据,由于我们无法用WEB RECEIVE API获得请求的数据,这里我们将用到前面介绍的从BLI的COMMAREA中取得数据。由于我们在Analy
41、zer中做了Code Page的转化,所以在User Program中我们不需要做任何的Code Page的转化,我们需要定义一个指向BLI COMMAREA的指针来获得请求的数据。以下为实现的部分C语言代码。对于请求的响应这里我们仍然可以用CICS WEB SEND并指定Code Page,同HTTP的处理没有区别。,7.3.4 CWS非HTTP请求的应用实现,以上我们解决了非HTTP请求中Analyzer接收数据的问题,通过CICS Web Support中的全局指针判断接收数据的长度,来实现连续两次调用Analyzer,同时完成了Code Page的转码,并在User Program中应
42、用BLI接口获得从Analyzer传来的请求数据。以下的应用通过Windows上的Java Socket程序向CICS发送TCP的请求数据包,CICS得到数据包后对Java客户端做出相应的响应。根据CWS处理非HTTP请求的原理,在User Program中用DFHWBBLI来得到请求数据,然后用WEB SEND API向Java端做出响应。CWS非HTTP请求的应用程序架构图如下图7-16所示:,以下是Java端的部分实现代码和返回结果:,在CICS端我们利用TSQ将非HTTP处理中程序的调用记录下来,如图7-17所示。可以看到,在调用User Program之前,CWS对Analyzer重复进行了两次调用,第一次收到1byte的数据,而第二次收到了完整请求的4byte数据(请求为字符串:mike)。,图7-17:TSQ中记录的非HTTP调用处理过程,