Cache实现HTTP服务
之前用C#实现的HTTP服务,Cache提供的有TCP功能,也能实现HTTP服务。基于此基础可以继续开发实现HTML嵌入M脚本达到动态脚本效果,类似CSP。也能处理提交的Soap协议XML,按XML调用M方法返回,实现不依赖csp配置模式的webservice。熬了一夜实现的初版HTTP服务。
/// d StartHttpServer^LIS.WS.Socket
/// 开启HTTP服务
StartHttpServer
//换行符
s rowsp=$c(13,10)
s Port=$g(Port)
s Port=50008
zw Port
s IP=$p($zu(54,13,$zu(54,0)),",")
s Device="|TCP|1"
s msg="发布在:"_IP_":"_Port_"上,用浏览器访问该地址"
//启动tcp
o Device:(:Port:"MA"):200
//测试是否成功
i $TEST=0
{
THROW ##class(%Exception.SystemException).%New("异常","D",,"作为服务端在端口:"_Port_"启动TCP连接失败,请检查端口")
QUIT
}
else
{
zw msg
}
//启动主侦听
d ListenMian
c Device
q ""
///主侦听函数,有线程处理客户端请求
ListenMian
u Device READ x
u 0
u Device
//用子线程处理客户端请求
j DealClient:(:17::)
//GOTO做成循环
GOTO ListenMian
///处理客户端请求
DealClient
s Device=##class(%SYSTEM.INetInfo).TCPName()
//客户端输入的数据
s input=$PRINCIPAL
s output=$IO
s record=""
u Device:(::"M")
//读取数据
s dataLen=0
s isb=0
s timeout=10
f r *x:timeout q:$c(x)="" d
.s record=record_$c(x)
.s dataLen=dataLen+1
.i $c(x)=$c(10),$e(record,dataLen-3,dataLen)=$c(13,10,13,10) s timeout=0 break
s rows=$l(record,rowsp)
s QType=""
s QPath=""
s HttpVertion=""
//解析请求头
f ri=1:1:rows d
.s oneRow=$p(record,rowsp,ri)
.i ri=1 d
..s QType=$p(oneRow," ",1)
..s QPath=$p(oneRow," ",2)
..s HttpVertion=$p(oneRow," ",2)
//返回默认页面
i QType="GET",((QPath="/")||(QPath="")) d
.s retHtml=$$GetDemoHtml()
.s retHead=$$GetRetHtmlHead($l(retHtml))
.w retHead,*-3
.w retHtml,*-3
q
/// 得到返回信息头
GetRetHtmlHead(ContentLength)
s head="HTTP/1.0 200 OK"_$c(13,10)
s head=head_"Content-Length:"_ContentLength_$c(13,10)
s head=head_"Server:zlzhttpd/0.0.1"_$c(13,10)
s head=head_"Content-Type:text/html"_$c(13,10)
s head=head_""_$c(13,10)
q head
/// 得到默认的页面
GetDemoHtml()
s retHtml="<HTML>"
s retHtml=retHtml_"<TITLE>Index</TITLE>"
s retHtml=retHtml_"<BODY>"
s retHtml=retHtml_"<P>Welcome to zlz's webserver.this is make by cache tcp</p>"
s retHtml=retHtml_"</BODY>"
s retHtml=retHtml_"</HTML>"
q retHtml
通过此实现可以:
1.熟悉Cache的TCPServer模式,帮助连仪器基础
2.熟悉HTTP交互
3.网站服务器没那么神秘
后面实现webservice调用M和简单的嵌入M脚本效果来论述webservice机制和(asp、jsp、csp)动态脚本简单示例
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码