http
require加载模块,搭建服务器
// 1. 加载 http 核心模块 var http = require('http') // 2. 使用 http.createServer() 方法创建一个 Web 服务器 // 返回一个 Server 实例 var server = http.createServer() // 3. 服务器要做的: // 提供服务:对 数据的服务 // 发请求 // 接收请求 // 处理请求 // 给个反馈(发送响应) // 注册 request 请求事件 // 当客户端请求过来,就会自动触发服务器的 request 请求事件,然后执行第二个参数:回调处理函数 server.on('request', function () { console.log('收到客户端的请求了') }) // 4. 绑定端口号,启动服务器 server.listen(3000, function () { console.log('恭喜你,服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问') })
端口号
- ip 地址定位计算机
- 端口号定位具体的应用程序
// ip 地址用来定位计算机 // 端口号用来定位具体的应用程序 // 所有需要联网通信的应用程序都会占用一个端口号 var http = require('http') var server = http.createServer() // 2. 监听 request 请求事件,设置请求处理函数 server.on('request', function (req, res) { console.log('收到请求了,请求路径是:' + req.url) console.log('请求我的客户端的地址是:', req.socket.remoteAddress, req.socket.remotePort) res.end('hello nodejs') }) server.listen(5000, function () { console.log('服务器启动成功,可以访问了。。。') })
Content-Type
- 服务器最好把每次响应的数据是什么内容类型都告诉客户端,而且要正确的告诉
- 不同的资源对应的 Content-Type 是不一样,具体参照:http://tool.oschina.net/commons
- 对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题
- 通过网络发送文件
发送的并不是文件,本质上来讲发送是文件的内容
当浏览器收到服务器响应内容之后,就会根据你的 Content-Type 进行对应的解析处理
示例
注意:
在服务端默认发送的数据,其实是 utf8 编码的内容 但是浏览器不知道你是 utf8 编码的内容 浏览器在不知道服务器响应内容的编码的情况下会按照当前操作系统的默认编码去解析 中文操作系统默认是 gbk 解决方法就是正确的告诉浏览器我给你发送的内容是什么编码的 在 http 协议中,Content-Type 就是用来告知对方我给你发送的数据内容是什么类型
/plain
/html
var http = require('http') var server = http.createServer() server.on('request', function (req, res) { // res.setHeader('Content-Type', 'text/plain; charset=utf-8') // res.end('hello 世界') var url = req.url if (url === '/plain') { // text/plain 就是普通文本 res.setHeader('Content-Type', 'text/plain; charset=utf-8') res.end('hello 世界') } else if (url === '/html') { // 如果你发送的是 html 格式的字符串,则也要告诉浏览器我给你发送是 text/html 格式的内容 res.setHeader('Content-Type', 'text/html; charset=utf-8') res.end('<p>hello html <a href="">点我</a></p>') } }) server.listen(3000, function () { console.log('Server is running...') })
http与fs混用
// 1. 结合 fs 发送文件中的数据 // 2. Content-Type // http://tool.oschina.net/commons // 不同的资源对应的 Content-Type 是不一样的 // 图片不需要指定编码 // 一般只为字符数据才指定编码 var http = require('http') var fs = require('fs') var server = http.createServer() server.on('request', function (req, res) { // / index.html var url = req.url if (url === '/') { // 我们要发送的还是在文件中的内容 fs.readFile('./resource/index.html', function (err, data) { if (err) { res.setHeader('Content-Type', 'text/plain; charset=utf-8') res.end('文件读取失败,请稍后重试!') } else { // data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串 // res.end() 支持两种数据类型,一种是二进制,一种是字符串 res.setHeader('Content-Type', 'text/html; charset=utf-8') res.end(data) } }) } else if (url === '/xiaoming') { // url:统一资源定位符 // 一个 url 最终其实是要对应到一个资源的 fs.readFile('./resource/ab2.jpg', function (err, data) { if (err) { res.setHeader('Content-Type', 'text/plain; charset=utf-8') res.end('文件读取失败,请稍后重试!') } else { // data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串 // res.end() 支持两种数据类型,一种是二进制,一种是字符串 // 图片就不需要指定编码了,因为我们常说的编码一般指的是:字符编码 res.setHeader('Content-Type', 'image/jpeg') res.end(data) } }) } }) server.listen(3000, function () { console.log('Server is running...') })