前言
什么是客户端,什么是服务器?
在网络节点上,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器。
net模块简介:
net模块是用于创建基于流的TCP和IPC协议的服务器和客户端
TCP与ICP的异同
TCP/IP-传输控制协议/网际协议地址;可在同一台机器或不同机器或不同操作系统的进程间进行通信;
IPC (Inter Process Communication) 即进程间通信;不能跨物理机器,只能在同一台机器上的不同进程间进行通信;
server
用于创建服务端
-
创建Server:var server = net.Server();
-
监听已有的连接:server.listen(端口号,ip);
-
监听事件使用on:
事件有: listening:当服务绑定后触发
connection:当一个新的connection(连接)建立的时候触发,有参数socket
close: 当server关闭的时候触发,注意要等到所有的连接都结束之后才触发
error: 当错误出现的时候触发 -
方法:
listen:监听已有的连接
close:关闭连接
address:返回绑定的地址,只有在listening事件被触发的时候菜可以调用该事件,不然返回的是一个空对象。
socket
可以由用户创建并直接与服务器交互
-
创建一个连接:
net.connect(端口号,ip); -
监听事件使用on:
事件有: connect:当一个socket连接成功建立的时候触发该事件
data:当接收到数据的时候触发该事件,数据编码由 socket.setEncoding() 设置
end: 关闭连接
timeout:连接超时触发
error: -
方法:
connect(端口,IP):创建连接
write(内容,编码格式-默认UTF8):在socket上发送数据
setTimeout():设置超时时长 -
属性:
localPort:用数字表示本地端口。例如80或21
localAddress:返回操作系统报告的 socket 的地址、地址族和端口。返回的对象有三个属性
示例:
服务端与客服端进行连接,发送消息
//tcp服务端 server
const net = require("net"); //引入net模块
const server = net.createServer(); //创建一个Server对象
server.listen('12306','127.0.0.1'); //监听已有的连接
//一些事件
server.on('listening',function () { //连接服务绑定后触发
console.log('服务器已启动');
});
server.on('connection',function (socket) { //当一个新的连接建立时触发,可接收一个socket对象
console.log('有新的连接!');
socket.on('data',function (data) {
console.log(data.toString());
socket.write('你好啊,客户端');
socket.write('客户端,请关闭连接~');
})
server.close();
})
server.on('close',function () { //关闭连接时触发
console.log('连接已关闭');
})
//tcp客户端 socket
const net = require("net"); //引入net模块
const socket = net.connect('12306','127.0.0.1'); //客户端创建一个连接
//失败事件
socket.on('error',function () {
console.log("连接失败");
})
socket.on('connect',function () { //连接成功时触发
console.log("连接服务器成功!");
socket.write("你好啊,服务器");
socket.on('data',function (data) { //接收到数据的时候触发
console.log(data.toString());
socket.end();
})
})
socket.on('end',function () {
console.log('我已主动关闭连接成功');
})
http模块简介:
http模块
是Node.js官方提供的、用来创建web服务器的模块。
通过http模块提供的http.createServser()
方法,就能方便地把一台普通的电脑,变成一台Web服务器,从而对外提供Web资源服务。
http模块
是构建在net模块之上的,实际上http中收发数据按照http协议自动帮助我们解析和包装,例如http模块自动将请求报文解析出来,然后挂载给了req对象
,这时候我们可以通过req对象
拿到想要的数据。
如果要使用http模块创建的Web服务器,就要先导入:
const http = require('http');
创建最基本的web服务器
- 导入http模块
- 创建web服务器实例
- 为服务器绑定request事件,监听客户端的请求
server.on()
- 启动服务器
server.listen()
const http = require('http');
const server = http.createServer()
//使用服务器实例的server.on()方法,为服务器绑定一个request事件
server.on('request',(req,res)=>{
//只要有客户端请求我们自己的服务器,就会触发request 事件,从而调用这个事件的处理函数
console.log('someone visit our web server.')
})
//调用server.listen(端口号,callback)方法即可启动web服务器
server.listen(8080,()=>{
console.log('http server running at http://127.0.0.1:8080')
})
request请求对象
只要服务器接收到了客户端的请求,就会调用通过server.on()
为服务器绑定的request事件处理函数
。
如果想在事件处理函数中,访问与客户端相关的数据或属性
,可以使用如下方式:
request请求对象常用属性
request.headers: 返回的是一个对象, 对象中包揽了所有的请求报文头
request.rawHeaders: 返回的是一个数组, 数组中保存的都是请求报文头的字符串
request.httpVersion: 获取客户端请求所使用的HTTP版本
request.method: 获取客户端请求的方法(get,post,put,delete等等)
request.url: 获取客户端请求的路径
response响应对象
在服务器中request事件处理函数中,如果想访问与服务器相关的数据或属性
,可以使用如下的方式:
response.write:主要用于输出内容信息,如将一些字符串信息输出到客户端。
response.end:这个方法告诉服务器所有要发送的响应头和响应体都发送完毕了
response.setHeader(name, value):设置响应报文头
response.statusCode:设置 http 响应状态码
response.statusMessage:设置 http 响应状态码对应的消息
response.writeHead(statusCode[, statusMessage][, headers]):直接向客户端响应(写入) http 响应报文头
response.Clear:清理缓冲区,终止输出。
示例:
server.on('request',(req,res)=>{
//res是响应对象,它包含了与服务器相关的数据和属性,例如:
//要发送到客户端的字符串
const str = `Your request url is ${req.url},and request method is ${req.method}`
//req.end()方法的作用
//向客户端发送指定的内容,并结束这次请求的处理过程
res.end(str)
})
解决中文乱码问题:
当调用res.end()方法,向客户端发送中文内容时,会出现乱码
问题,此时需要使用res.setHeader()手动设置内容的编码格式
。
示例:
server.on('request',(req,res)=>{
//发送的内容包含中文
const str = `您请求的 url 地址为 ${req.url} ,请求的 method 类型为 ${req.method}`
//为了防止中文显示乱码问题,需要设置响应头 Content-Type 的值为 text/html:charset=utf-8
res.setHeader(`Content-Type`,`text/html; charset=utf-8`)
//把包含中文的内容,响应给客户端
res.end(str)
})
net模块和http模块的区别
- net是用于创建TCP服务器与客户端 http是用于实现HTTP服务器端及客户端
- net对应传输层,http对应应用层。
而且http依赖net。 - http模块会对收发的数据进行协议格式解析和包装,而net模块不会