Node网络编程
一、网络编程
1.Node实现TCP协议
(1)TCP协议:传输控制协议,提供面向连接的、可靠的数据传输服务
-
面向连接:数据传输之前,客户端与服务器端要建立连接 -
可靠的:数据传输是有序的,要对数据进行校验 -
socket:网络套接字,是进行网络连接的数据结构(服务器的socket和客户端的socket) 服务器的socket:实现对指定端口号的监听,若有客户端向监听的端口发出连接请求,socket就会监听到 客户端的socket:主要是向服务器发送请求
(2)Node中的net模块:实现TCP的连接和服务,封装了大多数的类和方法,方便用户使用TCP进行网络连接
? A、导入
const net = require('net');
? B、服务器类:net.Server类,用于创建服务器类(TCP服务器)
const server = new net.Server([参数]);
const server = net.createServer([参数]);
? C、客户端类:net.Socket类通常用来创建客户端(TCP客户端)
const client = net.Socket([参数]);
示例代码:
const net = require('net');
var client = net.Socket();
client.connect(8880,'192.168.1.1',()=>{
console.log('已经连接到服务器');
client.write('我是TCP客户端');
})
client.on('data',(data)=>{
console.log('接收的服务器端数据是:'+data.toString());
})
client.on('end',()=>{
console.log('数据传输结束!');
})
const net = require('net');
var clientNo = 0;
const server = net.createServer((client)=>{
console.log(clientNo+'号客户端已经连接到服务器');
client.on('end',function (){
console.log(clientNo+'号客户端已经断开连接');
})
client.write(clientNo+'号客户端,你好!');
client.on('data',(data) => {
console.log(clientNo+'号发送过来的数据是:'+data)
})
})
server.on('error',(err) => {
throw err
})
server.listen(8880,()=>{
console.log('TCP服务器已经启动!')
});
2.Node实现UDP协议
(1)UDP协议:用户数据报协议:提供的是不可靠的、面向无连接的传输服务(只有数据报的发送方和接收方)
? A、面向无连接:在传输数据之前没有明确的连接链路(即不是所有的数据都是通过一条数据链路传输)
? B、不可靠的:因为数据传输不是通过一条链路完成的,因此接收方接受的数据不一定是按发送的顺序接收的,这样可能造成数据包的丢失。
(2)Node中的dgram模块:用于实现基于UDP协议的连接
? A、导入
const udp = require('dgram');
? B、dram.Socket类:提供了实现UDP协议的基本框架
? a.常用事件:
? listening:用于监听数据信息
? message:接收新数据报时触发
? b.常用方法:
? bind():绑定指定的地址和端口号(监听)
? send():发送数据报, 示例代码:
const dgram = require('dgram');
const client_msg = Buffer.from('你好,我是一个udp的客户端');
const client = dgram.createSocket('udp4');
client.on('close',()=>{
console.log('客户端已经关闭:');
})
client.on('error',(err)=>{
console.log(err)
})
client.on('message',(msg,rinfo)=>{
if (msg =='exit'){
client.close();
}
console.log(`接收到来自服务器:${rinfo.address}:${rinfo.port}的信息:${msg.toString()}`);
})
client.send(client_msg,8884,'localhost',(err)=>{
if (err){
client.close();
}
})
const dgram = require('dgram');
const server = dgram.createSocket('udp4');
server.on('error',(err)=>{
console.log(`服务器异常:${err.stack}`);
})
server.on('message',(msg,rinfo)=>{
var str_msg = msg.toString();
console.log(rinfo);
console.log(`服务器接收到来自${rinfo.address}:${rinfo.port}的${str_msg}`);
server.send('奥运会',rinfo.port,rinfo.address);
})
server.on('listening',()=>{
const server_address = server.address();
console.log(`服务器监听:${server_address.address}:${server_address.port}`);
})
server.bind(8884);
3.Node实现http协议(重点)
(1)http协议:超文本传输控制协议,是通用的、无状态的、与传输数据无关的协议(工作在应用层)
(2)客户端与服务器的交互过程:
? A、客户端与服务器建立TCP连接(http协议是基于TCP协议实现的)
? B、客户单向服务器发送请求报文
? C、服务器向客户端返回响应信息
? D、关闭http连接
(3)Node实现http的过程
? A、导入http模块
const http = require('http');
? B、创建服务器端:http.Server类(提供了实现http服务器的基本框架)
? 主要事件:
? request:当有请求发生时触发该事件。该事件被触发后,其对应的回调函数有request和response两个参数、
? connect:客户端发出http请求时触发
? 主要方法:
? createServer:创建http服务
? listen:启动http服务监听
? C、http.IncomingMessage类:该类的对象是请求对象,用于客户端向服务器发送请求信息。该类是由http.Server类或者http.ClientRequest类创建
? D、http.ServerResponse类:该类的对象是响应对象,用于服务器向客户端发送响应信息。
? E、get请求和post请求的区别
?
get请求:将请求参数包含在url中,示例:http://localhost:8090/index?name=lisi
? 请求参数会被保留在浏览器历史记录中
? 只能通过url进行编码
? 参数的数据类型只接收ASCII字符
? 参数的长度有限制
? 传输不安全,不能用来传递敏感信息
post请求:将请求参数包含在request body中
? 不会保留在浏览器的历史记录中
? 支持多种编码格式
? 对参数的数据类型没有限制
? 传输更安全
? F、Node实现post请求
? 强调:
? (1)通过浏览器地址栏向服务器发送的请求都是get请求
? (2)通过<a> 标签向服务器发送的也是get请求 示例代码:
const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({'msg': '你好,我是http的客户端'});
const options = {
hostname: '127.0.0.1',
port: 8090,
path: '/upload',
method: 'post',
headers: {
'content-type': 'application/x-www-form-urlencoded;charset=utf-8',
'content-length': Buffer.byteLength(postData)
}
}
const req = http.request(options, (res) => {
console.log(`状态码:${res.statusCode}`);
console.log(`响应头信息:${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`响应体:${chunk}`);
});
res.on('end', () => {
console.log('没有响应数据!请求结束');
});
res.on('error', (err) => {
console.log(err)
});
})
req.write(postData);
req.end();
const http = require('http');
const server = http.createServer((req, res) => {
console.log(`客户端的url是:`+req.url);
res.writeHead(200,{'content-type':'text/html;charset=utf8'});
res.write('<h1>你好,这里是服务器的响应!</h1>');
res.end();
})
server.listen(8090,()=>{
console.log('服务器已经启动,在8090端口监听--');
})
4.websocket协议
1.http协议存在的问题:
(1)频繁的请求-响应,增加了传输的数据流,浪费了带宽资源。
(2)不是实时的技术,只是模拟的实时技术。本质上采用的是轮询的方式。
(3)编程复杂,实现困难
2.WebSocket的实现机制
(1)在客户端和服务器进行连接时,使用的是http协议,连接完成后服务器端将协议升级成WebSocket
(2)在数据传输阶时,使用的是TCP协议进行传输(面向连接、安全可靠、实时性强)
(3)关闭连接:任何一方发出关闭命令,连接就会关闭
3.WebSocket的应用场景
(1)实时通信:聊天应用
(2)实时的数据展示和分析
(3)文档同步
4.WebSocket的实现
(1)导入库:ws
(2)创建WebSocket服务器:new WebSocket.Server(options)
? A、connection事件:客户端和服务器端成功握手时触发
? B、listening事件:绑定端口时触发
(3)创建WebSocket客户端 new WebSocket(address[,protocols],[,opyions])
? A、open事件:建立连接时触发
? B、message事件:接收到服务器消息时被触发,有一个参数data,表示接收到的数据,类型可以是字符串、Buffer
|