Node.js(五)—— 内置模块之net模块和http模块

前言

什么是客户端,什么是服务器?

在网络节点上,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器。

net模块简介:

net模块是用于创建基于流的TCP和IPC协议的服务器和客户端

TCP与ICP的异同

TCP/IP-传输控制协议/网际协议地址;可在同一台机器或不同机器或不同操作系统的进程间进行通信;

IPC (Inter Process Communication) 即进程间通信;不能跨物理机器,只能在同一台机器上的不同进程间进行通信;

server

用于创建服务端

  1. 创建Server:var server = net.Server();

  2. 监听已有的连接:server.listen(端口号,ip);

  3. 监听事件使用on:
    事件有: listening:当服务绑定后触发
    connection:当一个新的connection(连接)建立的时候触发,有参数socket
    close: 当server关闭的时候触发,注意要等到所有的连接都结束之后才触发
    error: 当错误出现的时候触发

  4. 方法:
    listen:监听已有的连接
    close:关闭连接
    address:返回绑定的地址,只有在listening事件被触发的时候菜可以调用该事件,不然返回的是一个空对象。

socket

可以由用户创建并直接与服务器交互

  1. 创建一个连接:
    net.connect(端口号,ip);

  2. 监听事件使用on:
    事件有: connect:当一个socket连接成功建立的时候触发该事件
    data:当接收到数据的时候触发该事件,数据编码由 socket.setEncoding() 设置
    end: 关闭连接
    timeout:连接超时触发
    error:

  3. 方法:
    connect(端口,IP):创建连接
    write(内容,编码格式-默认UTF8):在socket上发送数据
    setTimeout():设置超时时长

  4. 属性:
    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服务器

  1. 导入http模块
  2. 创建web服务器实例
  3. 为服务器绑定request事件,监听客户端的请求 server.on()
  4. 启动服务器 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模块不会
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值