# 七.流 目前最常用
- 可写流 ws.write();写入的内容 string or buffer
- 流 stream
let fs = require("fs")
let Stream = require("stream")
let rs = fs.createReadStream("./1.txt")
1
2
3
2
3
可读流继承的是 Readable 重写_read 可写流继承 writeable 重写_write
双工流
fd 标准出
process.stdout.write("hello") //可写流
1
fd2 错误输出 process.stderr.write('hello')
标准输入
fd 0 标准输入 监听 可读流
process.stdin.on("data", function(data) {
console.log(daat)
})
1
2
3
2
3
let { Duplex } = require("stream")
class MyDuplex extends Duplex {
//读和写可能没有关系,也可能是有关系
_read() {
this.push()
}
_write(chunk, encoding, clearBuffer) {
console.log(chunk)
clearBuffer()
}
}
let my = new MyDuplex()
my.on("data", function(data) {
console.log(data)
})
my.write("hello")
my.write("hello")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- 转化流 用的比较多的是压缩
class MyTransfer extends Transform {
_transform(chunk, encoding, clearBuffer) {
//参数和可写流是一样的
let str = chunk.toString().toUpperCase()
this.push(str)
clearBuffer()
}
}
let my = new MyTransfer()
//会监听可读流中的内容 把内容写入到可读流中
//应用场景压缩
process.stdin.pipe(my).pipe(process.stdout)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# http 协议和 tcp 协议
- ip 地址-解析-ip-tcp 通信
# 1.长链接
# 管线化
- 一个浏览器默认同时发送 6 个请求
# uri 和 url
- uri:统一资源标识符
- url:统一资源定位符
https:80
http:443
let str = "username:password@https://www.baidu.com:80/index.html?a=1#top"
1- URL 模块
let url = require("url") //把字符串转化成对象 let { pathname, query, hostname } = url.parse(str, true) console.log(pathname, query.a)
1
2
3
4
- URL 模块
- URN:统一资源命名符
- http 基于 tcp(http 头信息的作用 http 常见的状态吗)
- 状态码类别
- 2xx 成功
- 200(ok 客户端发过来的)
- 206
- 3xx
- 304
- 2xx 成功
- 206 一般叫范围请求 断点续传
- curl cmd 中
curl -v --header 'Range:bytes=0-3'http://baidu.com
1
304 服务端实现缓存(强制缓存 对比缓存)
401 没有权限
403
404
常见的方法(resful)
- get 获取
- post 增加
- put 修改
- delete 删除
- options preflight 预发射
跨域问题(协议域名端口号)
- (前端) webpack 启动一个服务 3000 后端 4000
# 响应报文
client.js
let http = require("http")
//建立客户端 有get request
// 可以爬虫 可以做中间层
let client = http.request(
{
method: "POST",
hostname: "localhost",
path: "/a=1#top",
headers: {
"Contetn-Type": "application/x-www-form-urlencoded",
},
port: 3000,
},
function(res) {
console.log(res.headers)
res.on("data", function(chunk) {
console.log(chunk)
})
}
)
//把请求真正的发出
//end方法中可以写入请求体
client.end('{ "name":"zpxf" }')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server.js
//node为了实现服务器
let http = require("http") //http内置模块
let querystring = require("querystring")
//req 指的是客户端的请求 可读流on('data')
//res 指的是 服务端的相应 可写流 write end
let server = http.createServer((req, res) => {
//监听函数,客户端请求到了后会执行回调函数
let arr = []
//方法
let method = req.method
console.log("方法", method)
//url
let url = req.url
console.log(url)
//版本号
let version = req.httpVersion
//获取请求头,对象的所有key都是小写的
let headers = req.headers
console.log("请求头", headers)
req.on("data", function(chunk) {
arr.push(chunk)
})
req.on("end", function() {
let str = Buffer.concat(arr).toString()
let obj
if (headers["content-type"] === "application/x-www-form-urlencoded") {
obj = querystring.parse(str)
} else {
obj = JSON.parse(obj)
}
//设置状态
res.statusCodeCode = 200
//设置头
res.setHeader("Content-Type", "application/json")
res.setHeader("a", "1")
//在给客户端写入响应体
res.end(JSON.stringify(obj))
console.log(str)
})
})
//listen EADDRINUSE :::3000端口被占用
let port = 3000
server.listen(port, function(err) {
console.log(`${port}端口连接成功`)
server.on("error", function(err) {
if (err.errno === "EADDRINUSE") {
port++
server.listen(port)
}
})
})
//nodemon 自动启动node服务
//
//查询字符串 希望把a=b&c=d 格式转成对象格式{a:b,c:d}
// let querystring = require("querystring");
// let obj = querystring(str, "$", "==");
// let s = querystring.stringify(obj);
// console.log(obj, s);
// str.replace(/([^&=]*)=([^&=]*)/g,function(){
// obj[arguments]
// });
//req
//req.method
//req.url
//req.headers
//req.on('data')
//res
//res.statusCode=200
//
//
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74