js中回呼函數實現一個http伺服器

來源:互聯網
上載者:User
本篇文章分享給大家的內容是關於js中回呼函數實現一個http伺服器,內容很詳細,接下來我們就來看看具體的內容,希望可以協助到大家。

網路操作

首先使用http模組實現一個http伺服器

var http = require('http');    // 使用http模組http.createServer (        function (request, response) {            response.writeHead(200, {'Content-Type': 'text-plain'});    // http回應標頭部            response.end('hello word\n');    // 返回的內容        }    ).listen(8124);    // 監聽8124連接埠
PS C:\Users\mingm\Desktop\test> node main.js

訪問http://127.0.0.1:8124/ 返回hello word

一些api

http模組

兩種方式,

  1. 作為伺服器端使用的時,建立一個http伺服器,監聽http用戶端請求,並返迴響應。

  2. 作為用戶端使用的時候,發起http用戶端請求,用來獲得伺服器端的響應

伺服器端的是以事件作為驅動的,建立伺服器時的回呼函數就會被調用一次,即,這是事件驅動

http要求標頭

http的請求本質是資料流,由要求標頭和請求體組成。
開啟瀏覽器的開發人員工具,選擇network面板,然後,重新整理頁面,再次,選擇一個檔案,在headers視窗中,顯示出當前檔案請求的http頭部資訊
<img src="https://melovemingming-125387...;>
同樣,Firefox的也一樣
<img src="https://melovemingming-125387...;>
先是要求標頭,後是請求體
http請求發送給伺服器時,是從頭到尾一個一個位元組以資料流的方式發送,http模組建立的http伺服器在接收到完整的要求標頭以後,進行回呼函數,

var http = require('http');    // 使用http模組http.createServer (        function (request, response) {            var body = [];            console.log(request.method);            console.log("--------------");            console.log(request.headers);            console.log("---------------");        }    ).listen(8124);    // 監聽8124連接埠
PS C:\Users\mingm\Desktop\test> node main.jsGET--------------{ host: '127.0.0.1:8124',  connection: 'keep-alive',  'cache-control': 'max-age=0',  'upgrade-insecure-requests': '1',  dnt: '1',  'user-agent':   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',  accept:   'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',  'accept-encoding': 'gzip, deflate, br',  'accept-language': 'zh-CN,zh;q=0.9' }---------------

回呼函數

var fs = require("fs");fs.readFile('input.txt', function (err, data) {    console.log("3333");    console.log(err);    console.log(data.toString());    console.log("3333");});console.log("程式執行結束!");
PS C:\Users\mingm\Desktop\test> node main.js程式執行結束!3333null333333333333333333333333333333PS C:\Users\mingm\Desktop\test>

當遇到需要i/o操作的時候,先跳過執行,在執行當前的內容。所以結果為此,然後在將執行完成的結果傳給參數列表的最後一個函數,所以最後一個函數為回調

http的回呼函數,請求

var http = require('http');http.createServer(    function (request, response) {        var body = [];        console.log(request.method);        console.log(request.headers);    console.log(1111111111);    console.log(body);       request.on('end', function () {        body = Buffer.concat(body);        console.log(222222222222222);        console.log(body.toString());    });    console.log(4444444444444);    response.writeHead(200, {'Content-Type': 'text-plain'});    response.end('hello word\n');    console.log(55555555555);    }).listen(8124);

執行結果

PS C:\Users\mingm\Desktop\test> node main.jsGET{ host: '127.0.0.1:8124',  connection: 'keep-alive',  'cache-control': 'max-age=0',  'upgrade-insecure-requests': '1',  'user-agent':   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',  dnt: '1',  accept:   'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',  'accept-encoding': 'gzip, deflate, br',  'accept-language': 'zh-CN,zh;q=0.9' }1111111111[]444444444444455555555555222222222222222GET{ host: '127.0.0.1:8124',  connection: 'keep-alive',  pragma: 'no-cache',  'cache-control': 'no-cache',  'user-agent':   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',  dnt: '1',  accept: 'image/webp,image/apng,image/*,*/*;q=0.8',  referer: 'http://127.0.0.1:8124/',  'accept-encoding': 'gzip, deflate, br',  'accept-language': 'zh-CN,zh;q=0.9' }1111111111[]444444444444455555555555222222222222222

此執行為非同步執行,先執行到

console.log(body);

由於request.on需要等待返回,所以非同步執行下方的語句

console.log(444);

接著返回內容,再執行request.on,將結果通知回到函數的最後一個參數,然後執行完畢。

http響應

服務端原樣將用戶端請求的請求體,返回給用戶端

PS C:\Users\mingm\Desktop\test> node main.js4444444444442222222233333333555555
var http = require("http");http.createServer(function (request, response){    console.log(444444444444);    response.writeHead(200, { 'Content-Type': 'text/plain' });                    // 為回應標頭,即原路發送給用戶端                    request.on(                        "data",                         function (chunk) {                            response.write(chunk);                            console.log(111111);                    });                    console.log(22222222);                    request.on('end', function() {response.end();console.log(555555)});                    console.log(33333333);                }).listen(8124);

寫的有點亂

http用戶端

node發送一個http用戶端請求

var options = {    hostname: 'www.iming.info',    port: 80,    // 連接埠為80    path: '/upload',    // 請求的路徑    method: 'POST',        // 請求的方法為post方法    headers: {        'Content-Type': 'application/x-www-form-urlencoded'    // 頭部資訊    },}var http = require('http');var request = http.request(options, function (response) {});request.write('hello word!');request.end();

以上發送了一個http請求。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.