..__Serve
function का उपयोग Http सेवा, TCP सेवा और Websocket सेवा (Http प्रोटोकॉल पर आधारित) बनाने के लिए किया जाता है।
एक स्ट्रिंग लौटाता है जो बनाई गई सेवा के आईपी पते और पोर्ट को रिकॉर्ड करता है. उदाहरण के लिएः127.0.0.1:8088
, [::]:8089
.
स्ट्रिंग
__Serve ((serveURI, हैंडलर) __Serve ((serveURI, हैंडलर,...args)
..serveURI
पैरामीटर का उपयोग प्रोटोकॉल, आईपी पते, पोर्ट और सेवा बाध्यता की अन्य सेटिंग्स को कॉन्फ़िगर करने के लिए किया जाता है, जैसे किhttp://0.0.0.0:8088?gzip=true
, यानी,http://:8088?gzip=true
.
serveURI
पैरामीटर सेटिंग, जैसेtcp://127.0.0.1:6666?tls=true
; आप प्रमाणपत्र और निजी कुंजी जोड़ सकते हैं, जैसे किtls=true&cert_pem=xxxx&cert_key_pem=xxxx
.serveURI
पैरामीटर सेटिंग्स, जैसेhttp://127.0.0.1:6666?gzip=true
; आप संपीड़न सेटिंग्स सेट कर सकते हैंःgzip=true
.
दserveURI
पैरामीटर Https के लिए प्रयोग किया जाता है, जैसे किhttps://127.0.0.1:6666?tls=true&gzip=true
; आप जोड़ सकते हैंcert_pem
औरcert_key_pem
प्रमाणपत्र को लोड करने के लिए पैरामीटर।serveURI
सच
स्ट्रिंग
दhandler
पैरामीटर का प्रयोग रूटिंग प्रोसेसिंग फंक्शन (Http प्रोटोकॉल), मैसेज प्रोसेसिंग फंक्शन (TCP प्रोटोकॉल), और स्ट्रीम प्रोसेसिंग फंक्शन (वेबसोकेट) में पास करने के लिए किया जाता है।
पैरामीटर द्वारा पास किया गया कॉलबैक फ़ंक्शनhandler
कई मापदंडों को परिभाषित कर सकते हैं, पहला मापदंड ctx ऑब्जेक्ट (संदर्भ ऑब्जेक्ट) है।
संचालक
सच
कार्य
कॉलबैक फ़ंक्शन का वास्तविक पैरामीटर पैरामीटर के रूप में पारित कियाhandler
. कई मापदंड हो सकते हैंarg
उदाहरण के लिए:
__Serve("http://:8088", function(ctx, a, b, c) {
Log(`ctx.host():`, ctx.host(), ", a=", a, ", b=", b, ", c=", c)
}, 1, 2, 3)
मापदंड1
, 2
, 3
में पारित किया जब कॉल__Serve()
समारोह पैरामीटर के अनुरूपa
, b
, c
कॉलबैक फ़ंक्शन में पारित किया।
आर्ग झूठी string, number, bool, object, array, function, null value और सिस्टम द्वारा समर्थित अन्य प्रकार
function main() {
let httpServer = __Serve("http://:8088?gzip=true", function (ctx) {
Log("http connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
let path = ctx.path()
if (path == "/") {
ctx.write(JSON.stringify({
path: ctx.path(),
method: ctx.method(),
headers: ctx.headers(),
cookie: ctx.header("Cookie"),
remote: ctx.remoteAddr(),
query: ctx.rawQuery()
}))
} else if (path == "/tickers") {
let ret = exchange.GetTickers()
if (!ret) {
ctx.setStatus(500)
ctx.write(GetLastError())
} else {
ctx.write(JSON.stringify(ret))
}
} else if (path == "/wss") {
if (ctx.upgrade("websocket")) { // upgrade to websocket
while (true) {
let r = ctx.read(10)
if (r == "") {
break
} else if (r) {
if (r == "ticker") {
ctx.write(JSON.stringify(exchange.GetTicker()))
} else {
ctx.write("not support")
}
}
}
Log("websocket closed", ctx.remoteAddr())
}
} else {
ctx.setStatus(404)
}
})
let echoServer = __Serve("tcp://:8089", function (ctx) {
Log("tcp connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
while (true) {
let d = ctx.read()
if (!d) {
break
}
ctx.write(d)
}
Log("connect closed")
})
Log("http serve on", httpServer, "tcp serve on", echoServer)
for (var i = 0; i < 5; i++) {
if (i == 2) {
// test Http
var retHttp = HttpQuery("http://127.0.0.1:8088?num=123&limit=100", {"debug": true})
Log("retHttp:", retHttp)
} else if (i == 3) {
// test TCP
var tcpConn = Dial("tcp://127.0.0.1:8089")
tcpConn.write("Hello TCP Server")
var retTCP = tcpConn.read()
Log("retTCP:", retTCP)
} else if (i == 4) {
// test Websocket
var wsConn = Dial("ws://127.0.0.1:8088/wss|compress=gzip")
wsConn.write("ticker")
var retWS = wsConn.read(1000)
Log("retWS:", retWS)
// no depth
wsConn.write("depth")
retWS = wsConn.read(1000)
Log("retWS:", retWS)
}
Sleep(1000)
}
}
# Unsupported
// Unsupported
Websocket
सेवा HTTP प्रोटोकॉल के आधार पर लागू किया जाता है. आप पथ में एक रूटिंग शाखा सेट कर सकते हैं और के लिए कार्यान्वयन कोड डिजाइनWebsocket
आप इस अनुभाग में नमूने कोड का संदर्भ ले सकते हैं।पैरामीटर द्वारा पास किया गया कॉलबैक फ़ंक्शनhandler
प्राप्त करता हैctx
पैरामीटर।ctx
पैरामीटर एक संदर्भ वस्तु है जिसका उपयोग डेटा प्राप्त करने और लिखने के लिए किया जाता है, निम्नलिखित विधियों के साथः
- ctx.proto (()
Http/TCP प्रोटोकॉल पर लागू, कॉल करने पर प्रोटोकॉल का नाम लौटाता है। उदाहरण के लिएःHTTP/1.1
, tcp
.
- ctx.host (()
एचटीटीपी प्रोटोकॉल पर लागू, यह आईपी पते और बंदरगाह को बुलाते समय मेजबान जानकारी लौटाता है।
- ctx.path (()
Http प्रोटोकॉल पर लागू किया जाता है, जब बुलाया जाता है तो अनुरोध पथ लौटाता है.
- ctx.query ((कुंजी)
HTTP प्रोटोकॉल पर लागू किया जाता है, अनुरोध में क्वेरी में कुंजी के अनुरूप मान लौटाता है जब बुलाया जाता है। उदाहरण के लिए, भेजा गया अनुरोध हैःhttp://127.0.0.1:8088?num=123
, और पैरामीटर द्वारा पारित कॉलबैक प्रसंस्करण समारोहhandler
रिटर्न"123"
कबctx.query("num")
कहा जाता है।
- ctx.rawQuery()
Http प्रोटोकॉल पर लागू, जब बुलाया जाता है, तो अनुरोध में मूल क्वेरी (Http अनुरोध की क्वेरी) लौटाता है।
- ctx.headers ((()
Http प्रोटोकॉल पर लागू किया जाता है, और अनुरोध में अनुरोध हेडर जानकारी लौटाता है जब बुलाया जाता है.
- ctx.header ((कुंजी)
HTTP प्रोटोकॉल पर लागू, यह कहा जाता है जब निर्दिष्ट अनुरोध हेडर में एक कुंजी का मूल्य देता है. उदाहरण के लिए, प्राप्तUser-Agent
वर्तमान अनुरोध के शीर्षकों मेंःctx.header("User-Agent")
.
- ctx.method (()
Http प्रोटोकॉल पर लागू किया जाता है, जब बुलाया जाता है तो अनुरोध विधि लौटाता है, जैसे किGET
, POST
आदि।
- ctx.body (()
Http प्रोटोकॉल के POST अनुरोध पर लागू किया जाता है, और बुलाए जाने पर अनुरोध का शरीर लौटाता है.
- ctx.setHeader ((कुंजी, मान)
उत्तर संदेश की अनुरोध हेडर जानकारी सेट करने के लिए HTTP प्रोटोकॉल पर लागू किया गया।
- ctx.setStatus (कोड)
Http प्रोटोकॉल पर लागू, Http संदेश स्थिति कोड सेट करें. आमतौर पर, Http स्थिति कोड रूटिंग शाखा के अंत में सेट किया जाता है. डिफ़ॉल्ट मान 200 है.
- ctx.remoteAddr ((()
Http/TCP प्रोटोकॉल पर लागू, रिमोट क्लाइंट का पता और अनुरोध में पोर्ट वापस करता है जब बुलाया जाता है.
- ctx.localAddr()
Http/TCP प्रोटोकॉल पर लागू, सेवा के स्थानीय पते और बंदरगाह को वापस करता है जब बुलाया जाता है।
- ctx.upgrade ((ctx
वेबसॉकेट प्रोटोकॉल के लिए संदर्भ वस्तु; यदि स्विच सफल होता है तो एक बूलियन मान (सही) और यदि यह विफल होता है तो एक बूलियन मान (गलत) लौटाता है।
- ctx.read ((timeout_ms)
HTTP प्रोटोकॉल पर आधारित वेबसॉकेट प्रोटोकॉल कार्यान्वयन/टीसीपी प्रोटोकॉल पर लागू, वेबसॉकेट कनेक्शन और टीसीपी कनेक्शन का डेटा पढ़ता है।read
विधि साधारण HTTP प्रोटोकॉल में समर्थित नहीं है. आप समय सीमा पैरामीटर निर्दिष्ट कर सकते हैंtimeout_ms
मिलीसेकंड में।
- ctx.write ((s)
HTTP/TCP प्रोटोकॉल के लिए लागू, स्ट्रिंग डेटा लिखने के लिए इस्तेमाल किया. आप उपयोग कर सकते हैंJSON.stringify()
JSON ऑब्जेक्ट को एक स्ट्रिंग में एन्कोड करने के लिए और फिर इसे लिखने के लिए.WebSocket
प्रोटोकॉल, आप क्लाइंट को एन्कोडेड स्ट्रिंग पास करने के लिए इस विधि का उपयोग कर सकते हैं.
{@fun/Global/HttpQuery HttpQuery}, {@fun/Global/HttpQuery_Go HttpQuery_Go}
इवेंट लूप _G