可读流和可写流
var rs = fs.createReadStream
var ws =fs.createWriteStream
rs.pipe(ws)
res.on('data',function(data){
let flag = ws.write(data)
if(!flag) {
rs.pause()
}
})
ws.on('drain',function(){
rs.resume()
// 流动模式
})
// pipe的原理实现如上
可读流有两类
on('data')和on('readable') 。 不经常用 on('end')
可写流 ws.write()
ws.end()
双工流 既能读又能写
let {Duplex} = require('stream')
可读流要重写_read 可写流重写_write
双工流 两个都要重写
读流和写流
process.stdin.pipe(process.stdout)
http 和websocket 都是基于tcp封装的
let net = require('net')
// 创建了tcp服务
let server = net.createServer(functuion(socket){
// socket 套接字 双工流
socket.setEncoding('utf8')
socket.on('data',function(data){
socket.write('welcome');
socket.end()
})
}
})
server.listen(3000,function(){
})
http和tcp http是基于tcp的 封装了请求头
访问可以返回
回调函数的形式可以改成下面的方式
server.on('connection',function(socket)
//PuTTY
//ssh
{
server.getConnections(function(err,count){
socket.wirte(`${server.maxconnections }`)
server.close()
// 新来的不能访问 都走完后会关闭服务器
server.unref()
//默认会关闭客户端 只要有人就不会关闭
})
// 每次链接都会产生一个socket
})
telnet localhost 3000
tcp链接
server.maxconnections = 3 最大链接数量
监听端口占用
server.on('error',function(err){
if(err.code === 'EADDRINUSE'){
server.listen(3001)
}
})