HTTP入门(三):使用Nodo.js脚本实现简易服务器

HTTP入门(三):使用Nodo.js脚本实现简易服务器

  • 本文通过简单的Node.js脚本模拟服务器请求与响应原理
  • 本文主要目的是对学习内容进行总结以及方便日后查阅。
  • 本文所引用的图片和文字版权归原作者所有,侵权删。
  • 如有错误请在下方评论区指出,欢迎积极讨论。

前言


  • 硬件服务器:我们的电脑就是一个服务器。和普通的服务器的区别是:真正的服务器CPU可能有128G核,32、64、128G内存。没有GUI,没有显示器,用ssh远程登录,本质还是电脑
  • 软件服务器:服务器上的软件。

服务器你已经有了,你使用的电脑就是服务器。但是你还没有提供 HTTP 服务的「程序」
脚本就可以提供 HTTP 服务,不管是 Bash 脚本还是 Node.js 脚本都可以。这篇文章先用 Node.js 脚本试试水。

接收请求


我们的脚本只需要一个文件就可以搞定:

  • 新建一个安全的目录

          cd ~/Desktop
          mkdir node-demo
          cd node-demo
    
  • touch server.js

  • 编辑 server.js,内容已上传到GitHub,所以用命令

    curl https://raw.githubusercontent.com/mtt3366/nodeserver/master/NodeServer.js > ./server.js
    

    拷贝代码到server.js

    示例

  • cat server.js查看内容是否已经拷贝。
    查看
  • node server.js 8888 监听8888本地端口,这里端口参数不建议写0-1023,因为小于1024已经被规定使用,需要管理员权限才可以访问。
  • 成功之后,这个 server 会保持运行,无法退出。
  • 如果你想「中断」这个 server,按 <kbd>Ctrl</kbd> + <kbd>C</kbd> 即可(C 就是 Cancel 的意思),中断后你才能输入其他命令。
  • 把这个 server 放在那里别动,新开一个 Bash 窗口,完成下面的测试
    好了服务器完成。只不过
  1. 这个服务器目前只有一个功能,那就是打印出路径查询字符串
  2. 还缺少一个重要的功能,那就是发出 HTTP 响应,目前我们先不发出响应
    接下来要发起一个请求到这个服务器。这听起来有点怪异,「我向自己发起请求」,目前是的,因为我们的电脑既是客户端,又是服务器,还是会经历HTTP协议,还是会走一遍TCP/IP协议,所以用本机来学习服务器原理可行。接下来
  • 在新的 Bash 窗口运行 curl http://localhost:8888/xxx 或者 curl http://127.0.0.1:8888/xxx
    你会马上发现 server 打印出了路径:
    MTT说:得到 HTTP 路径
    /xxx
    MTT说:查询字符串为

    MTT说:不含查询字符串的路径为
    /xxx

这说明:

  1. 我们的 server 收到了我们用 curl 发出的请求
  2. 由于 server 迟迟没有发出响应,所以 curl 就一直等在那里,无法退出(用 <kbd>Ctrl</kbd> + <kbd>C</kbd> 中断这个傻 curl)
  3. 运行curl "http://127.0.0.1:8888/xxx?name=ff"
    打印结果:
    MTT说:得到 HTTP 路径
    /xxx?name=ff
    MTT说:查询字符串为
    ?name=ff
    MTT说:不含查询字符串的路径为
    /xxx

这个服务器就一个功能,把路径和查询参数打印出来,不发出响应

发出响应


接下来我们让我们 server 发出响应,不在让客户端端一直等我们

  1. 编辑 server.js
  2. 在中间我标注的区域添加两行代码
  3. response.write('Hi')
  4. response.end() 如果没有这句话,客户端还会一直等
  5. 中断之前的 server,重新运行 node server 8888
  6. curl http://127.0.0.1:8888/xxx,结果如下:
  7. Hi%
    这个 % 不是我们的内容,% 表示结尾。如果你看 % 不爽,就把 'Hi' 换成 'Hi\n'
  8. 响应添加成功
  9. 使用 curl -s -v -- "http://localhost:8888/xxx" 可以查看完整的请求和响应
    示例

根据请求返回不同的响应


响应 /404

将中间的代码改为

if(path  ==  "/" ){
    response.write('Hi')
    response.end()
    }   else{
    response.statusCode = 404
    response.end()
    }

代码示例


代码示例

不同的请求返回内容的截图

响应404

1

响应/

image

响应 /index.html

代码修改


image

响应示例


image

强调:后缀是废话。文件内容是有 HTTP 头中的 Content-Type 保证的

响应真正的网页

  • 完整代码:
var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]

if(!port){
  console.log('请指定端口号好不啦?\nnode server.js 8888 这样不会吗?')
  process.exit(1)
}

var server = http.createServer(function(request, response){
  var parsedUrl = url.parse(request.url, true)
  var path = request.url 
  var query = ''
  if(path.indexOf('?') >= 0){ query = path.substring(path.indexOf('?')) }
  var pathNoQuery = parsedUrl.pathname
  var queryObject = parsedUrl.query
  var method = request.method

  /******** 从这里开始看,上面不要看 ************/

  console.log('HTTP 路径为\n' + path)
  if(path == '/style.js'){
    response.setHeader('Content-Type', 'text/css; charset=utf-8')
    response.write('body{background-color: #ddd;}h1{color: red;}')
    response.end()
  }else if(path == '/script.html'){
    response.setHeader('Content-Type', 'text/javascript; charset=utf-8')
    response.write('alert("这是JS执行的")')
    response.end()
  }else if(path == '/index.css'){
    response.setHeader('Content-Type', 'text/html; charset=utf-8')
    response.write('<!DOCTYPE>\n<html>'  + 
      '<head><link rel="stylesheet" href="/style.js">' +
      '</head><body>'  +
      '<h1>你好</h1>' +
      '<script src="/script.html"></script>' +
      '</body></html>')
    response.end()
  }else{
    response.statusCode = 404
    response.end()
  }

  /******** 代码结束,下面不要看 ************/
})

server.listen(port)
console.log('监听 ' + port + ' 成功\n请用在空中转体720度然后用电饭煲打开 http://localhost:' + port)

  • 接下来 curl -s -v – "http://localhost:8888"

    image
  • 因为响应中<link rel="stylesheet" href="/style.js"><script src="/script.html"></script>服务器会接着继续发出/script/style响应。

  • 包括图片路径,也会发出响应。

  • 模拟一下/script/style响应。

    image

  • 为了证实我们的想法,打开network查看请求与响应。发现确实有三个响应。


    image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,672评论 18 139
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    Myselfyan阅读 4,072评论 2 58
  • xdh精英班20160909课后作业: Node.js HTTP 介绍 本文根据xdh精英班20160909课后作...
    birdflying阅读 874评论 0 4
  • 01 乔布斯没有争辩说开公司他们一定能赚钱,而是说这一定会是一次有趣的经历。即使赔了钱,他们也能拥有一家公司,这比...
    小碗月牙阅读 236评论 0 0
  • 心甘情愿的做那些你认为好的事,比如健身,比如写作,不要把他们当做负担,因为你的初衷是让自己快乐。
    阿凯同学阅读 126评论 0 0