之前用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)動態腳本簡單示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/356080.html
標籤:其他
上一篇:計算及網路第四章(網路層)
