美文网首页
HTTP(三): 一个简易的server

HTTP(三): 一个简易的server

作者: lyp82nkl | 来源:发表于2019-06-07 23:33 被阅读0次

Node.js 服务器

接收请求

  1. 新建一个安全的目录。
    cd ~/Desktop; mkdir node-demo; cd node-demo
  2. touch server.js
  3. 编辑 server.js,GitHub
  4. 运行 node server 或者 node server.js,看到报错
  5. 根据报错提示调整你的命令
  6. 成功之后,这个 server 会保持运行,无法退出
    • 如果你想「中断」这个 server,按 <kb>Ctrl</kbd> + <kbd>C</kbd> 即可
    • 中断后你才能输入其他命令
    • 我建议你把这个 server 放在那里别动,新开一个 Bash 窗口,完成下面的教程

好了服务器完成。只不过

  1. 这个服务器目前只有一个功能,那就是打印出路径和查询字符串
  2. 还缺少一个重要的功能,那就是发出 HTTP 响应

目前我们先只做一个功能。

接下来你要发起一个请求到这个服务器。这听起来有点怪异,「我向自己发起请求」,目前是的,因为你买不起服务器啊。

在新的 Bash 窗口运行 curl http://localhost:你的指定的端口/xxx 或者 curl http://127.0.0.1:你指定的端口/xxx

你会马上发现 server 打印出了路径:

图片
  1. 这说明我们的 server 收到了我们用 curl 发出的请求
  2. 由于 server 迟迟没有发出响应,所以 curl 就一直等在那里,无法退出(用 <kb>Ctrl</kbd> + <kbd>C</kbd> 中断)
发出响应

接下来我们让我们 server 发出响应

  1. 编辑 server.js
  2. 在中间我标注的区域添加两行代码
 response.write('Hi')
 response.end()

3.中断之前的 server,重新运行 node server 8888
4.curl http://127.0.0.1:8888/xxx,结果如下:

Hi%

这个 % 不是我们的内容,% 表示结尾。

  1. 好了,响应添加成功
  2. 使用 curl -s -v -- "http://localhost:8888/xxx" 可以查看完整的请求和响应
根据请求返回不同的响应
  • 响应 /
  • 响应 /xxx
  • 响应 404
  • 响应 /xxx.html
  • 响应 /xxx.frank
  • 再次强调,后缀是废话。文件内容是有 HTTP 头中的 Content-Type 保证的
  • 响应 /xxx.css
  • 响应 /xxx.js
  • HTTP 路径不是文件路径!!!/xxx.html 不一定对应 xxx.html 文件
完整的代码
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)
在node里引入另一个文件的时候的两种写法:

1.直接在response.write()内写入文件的内容(注意这种写法必须声明响应头类型)

//声明响应头让页面知道这是一个css类型文件
response.setHeader('Content-Type','text/css; charset=utf-8')
response.write('body{background-color:gray;}h1{color:red;}')

2.通过fs.readFileSync('路径','utf8'),直接引入一个文件

var string = fs.readFileSync('./index.html','utf8');
response.write(string);

相关文章

  • HTTP(三): 一个简易的server

    Node.js 服务器 接收请求 新建一个安全的目录。cd ~/Desktop; mkdir node-demo;...

  • Nodejs核心模块 HTTP服务器与客户端

    概要 http模块包含了一个高效的http服务器和一个简易的http客户端。http.Server 是一个基于事件...

  • GO http server (III) 组建简易 HTTP S

    上篇提到 DefaultServerMux 作为默认的 HTTP Server 框架太过简单,缺少很多功能。这篇我...

  • 本地模拟node服务器

    进入dist文件夹 cd dist 全局安装简易node服务器 npm install http-server -...

  • Python简易Web服务器(1)

    本文主要是用Python3的http.server实现一个简易的Web服务器,具体的参考可在此查看[%5Bhttp...

  • 一个简易server

    Tim Berners-Lee写出了第一个网页、第一个浏览器和第一个服务器。网页我们见过,浏览器我们见过,但我们还...

  • 一个简易 Server

    Node.js 服务器 接收请求 1.新建一个安全的目录cd ~/Desktop; mkdir node-demo...

  • 一个简易的server

    我们现在就来搞起一个服务器吧,然后提供 HTTP 服务。 服务器你已经有了,你使用的电脑就是服务器。 但是你还没有...

  • 004、Nginx的默认配置语法

    一、基础语法 二、http 一个http能有多个sever,一个server能有多个location。 三、广告 ...

  • 搭建服务器

    http-server 使用 http-server node工具启动一个静态服务器 server-moke 使用...

网友评论

      本文标题:HTTP(三): 一个简易的server

      本文链接:https://www.haomeiwen.com/subject/jzcbxctx.html