IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Node的网络编程 -> 正文阅读

[网络协议]Node的网络编程

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([参数]);

示例代码:

//客户端创建
//导入net模块
const net = require('net');
//创建TCP客户端
var client = net.Socket();

//连接服务器,使用connect方法
//8234
client.connect(8880,'192.168.1.1',()=>{
    console.log('已经连接到服务器');
    client.write('我是TCP客户端');  //向服务器发送数据
})

//接收服务器端数据:绑定'data'事件
client.on('data',(data)=>{
    console.log('接收的服务器端数据是:'+data.toString());
})

//绑定end事件
client.on('end',()=>{
    console.log('数据传输结束!');
})
//服务器端创建
//导入net模块
const net = require('net');
var clientNo = 0; //定义编号,标识每一个连接到服务器的客户端
//创建TCP服务器
const server = net.createServer((client)=>{ //client表示的是客户端
    console.log(clientNo+'号客户端已经连接到服务器');
    //绑定end事件:客户端断开连接时触发
    client.on('end',function (){
        console.log(clientNo+'号客户端已经断开连接');
    })
    client.write(clientNo+'号客户端,你好!');
    // client.pipe(client);
    //绑定data事件,接收是数据时触发
    client.on('data',(data) => {
        console.log(clientNo+'号发送过来的数据是:'+data)
    })
    // clientNo++;



})
//绑定error事件:连接出错时打印错误信息
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的客户端');

//创建客户端的socket
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();
    }
})
//服务器端
//导入dgram模块
const dgram = require('dgram');

//创建dgram.Socket对象(服务端---数据的接收端)
const server = dgram.createSocket('udp4');

//绑定error事件
server.on('error',(err)=>{
    console.log(`服务器异常:${err.stack}`);
})

//绑定message事件
//参数msg表示客户端发送过来的信息,参数rinfo封装了客户端的信息(客户端的地址,端口号)
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');
//导入querystring模块,获取客户端的请求参数
const querystring = require('querystring');

//创建请求数据:通过querystring模块的stringify方法将请求数据转换为JSON格式
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');

//创建http服务器,参数'req'是请求对象request,参数'res'是响应对象response。
//通过req获取客户端的请求数据,
//res是向客户端发送响应数据
const server = http.createServer((req, res) => {
    console.log(`客户端的url是:`+req.url);
    //设置响应头信息
    /*
    200:状态码,表示请求-响应成功
    content-type:设置响应的格式和编码格式
    */
    res.writeHead(200,{'content-type':'text/html;charset=utf8'});
    res.write('<h1>你好,这里是服务器的响应!</h1>');
    // res.end('<h2>响应结束了!关闭连接</h2>');
    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

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:32:49  更:2021-08-30 12:33:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:31:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码