Node.js基础四

1.JWT基础

1.对称加密:

var jwt = require('jsonwebtoken');
    //下面演示对称加密:
    // 加密,第一个参数是载荷,第二个参数是密钥,sign是加密方法
    const tk = jwt.sign({ username: 'admin' }, 'shhhh')
    res.send(tk)

    //验证
    const decoded = jwt.verify(tk, 'shhhh')
    console.log(decoded)

2.非对称加密

1.密钥生成:

openssl

  • 生成私钥:

    genrsa -out rsa_private_key.pem 2048

  • 根据私钥生成公钥:

    rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

2.根据密钥生成token

    //非对称加密:
    const privateKey = fs.readFileSync(path.join(__dirname, '../keys/rsa_private_key.pem'))
    const tk = jwt.sign({ username: 'admin' }, privateKey, { algorithm: 'RS256' })
    const publicKey = fs.readFileSync(path.join(__dirname, '../keys/rsa_public_key.pem'))
    res.send(tk)

    const result = jwt.verify(tk, publicKey)
    console.log(result)

2.Socket

  • 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
  • 官网:http://socket.io

img

1.基于 Net 模块的 Socket 编程

Client.js

const net = require('net')

const client = net.createConnection({ port: 9000 }, () => {
    //connect listener
    console.log('connected to server!')
    client.write('world!\n')

})

client.on('data', (data) => {
    console.log(data.toString())

    //表示断开连接
    // client.end()
})
client.on('end', () => {
    console.log('disconnected from server...')
})

Server.js

//net是一个内置模块
const net = require('net')

const server = net.createServer((socket) => {
    //socket.write(data,[encoding],[callback])
    socket.write('hello')
    // socket.end('goodbye\n');
    socket.on('data', (chunk) => {
        console.log(chunk.toString())
    })

})
server.on('error', (err) => {
    //Handle errors here
    throw err
})

//Grab an arbitrary unused port
server.listen(9000, () => {
    console.log('opened server on', server.address())
})
  • 广播

Client.js

注意:这里不能使用nodemon启动,否则会出现输入一次就会打印一次的情况

const net = require('net')
const readline = require('readline')
var port = 9000
var host = 'localhost'
var socket = new net.Socket()
socket.setEncoding = 'UTF-8'

socket.connect(port, host, () => {
    socket.write('hello.')
})
socket.on('data', (data) => {

    //这里是获取到了服务端返回的数据并且显示出来
    console.log(data.toString())

    say()
})
socket.on('error', function (err) {
    console.log(err)
})
socket.on('close', function () {
    console.log('connection closed')
})
const r1 = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})
function say() {
    r1.question('please input:\n', (inpurMsg) => {
        if (inpurMsg !== 'bye') {
            socket.write(inpurMsg + '\n')
        } else {
            socket.destroy()
            r1.close()
        }
    })
}

  • Server.js
//net是一个内置模块
// const net = require('net')

// const server = net.createServer((socket) => {
//     //socket.write(data,[encoding],[callback])
//     socket.write('hello')
//     // socket.end('goodbye\n');
//     socket.on('data', (chunk) => {
//         console.log(chunk.toString())
//     })

// })
// server.on('error', (err) => {
//     //Handle errors here
//     throw err
// })

// //Grab an arbitrary unused port
// server.listen(9000, () => {
//     console.log('opened server on', server.address())
// })

const net = require('net')

const server = new net.createServer()

//记录用户名
let clients = {}
//记录用户序号
let clientName = 0

server.on('connection', (client) => {
    client.name = ++clientName
    clients[client.name] = client

    client.on('data', (msg) => {
        console.log('客户端传来:' + msg);
        broadcast(client, msg)
    })

    client.on('error', (e) => {
        console.log('client error' + e);
        client.end()
    })

    //表示关闭操作
    client.on('close', (data) => {
        delete clients[client.name]
        console.log(client.name + ' 下线了');
    })
})
function broadcast(client, msg) {
    for (var key in clients) {
        clients[key].write(client.name + ' 说:' + msg)
    }
}



server.listen(9000, 'localhost')

2.基于WebSocket(ws)的Socket编程

  • 在浏览器中的控制台输入WebSocket,如果有则说明浏览器支持websocket

在这里插入图片描述

  • 安装ws(a Node.js WebSocket library):npm i ws

前端:

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>WebSocket</title>
    <script src="./js/WsClient.js" charset="utf-8"></script>
</head>

<body>
    <h1>gp 交流区</h1>
    <div id="content" name="name" style="overflow-y: scroll; width: 400px; height: 300px; border: solid 1px #000"></div>
    <br />
    <div>
        <input type="text" id="msg" style="width: 200px;">
    </div>
    <button id="submit">提交</button>
    <script>
        document.querySelector('#submit')
            .addEventListener('click', function () {
                var msg2 = msg.value
                ws.send(msg2) // 核心代码,将表单里的数据提交给server端
                msg.value = ''
            }, false)
    </script>
</body>

</html>

WsClient.js

var ws = new WebSocket('ws://localhost:9527/')

ws.onopen = () => {
    console.log(0)
    ws.send('大家好!')
    ws.send('hello')
    console.log(1)
}

ws.onmessage = (msg) => {
    console.log(msg)
    console.log(s = msg.data)
    const content = document.getElementById('content')
    content.innerHTML += msg.data + '<br/>'
}

ws.onerror = (err) => {
    console.log(err);
}

ws.onclose = () => {
    console.log('closed~');
}

后端:

Server.js

const WebSocket = require('ws');

const wss = new WebSocket.WebSocketServer({ port: 9527 });

wss.on('connection', function connection(ws) {

    ws.on('open', function open() {
        console.log('connected')
    })

    //注意最新版本的ws才有isBinary这个参数,而且是必填项
    ws.on('message', function message(data, isBinary) {
        //广播操作
        wss.clients.forEach(function each(client) {
            if (client.readyState === WebSocket.OPEN) {
                client.send(data, { binary: isBinary });
            }
        });
    });



    ws.on('close', function close() {
        console.log('disconnected')
    })
});


3.基于Socket.io的Socket编程

  • 最低可以兼容ie8,这个也是企业常用的一种方案

  • socket.io官网:https://socket.io/

  • 安装插件:npm i socket.io npm i express

  • 前端:

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>socket.io</title>
    <!-- <script src="./js/socket.io.js" charset="utf-8"></script> -->
    <script src="https://cdn.bootcdn.net/ajax/libs/socket.io/4.5.1/socket.io.js"></script>
</head>

<body>
    <h1>gp 交流区</h1>
    <div id="content" name="name" style="overflow-y: scroll; width: 400px; height: 300px; border: solid 1px #000"></div>
    <br />
    <div>
        <input type="text" id="msg" style="width: 200px;">
    </div>
    <button id="submit">提交</button>
    <script>
        var socket = io.connect('http://localhost:3000');
        const content = document.getElementById('content')
        document.querySelector('#submit')
            .addEventListener('click', function () {
                var msg2 = msg.value
                //emit提交/触发,事件名,事件要传递的值
                socket.emit('receive', msg2) // 核心代码
                msg.value = ''
                content.innerHTML += msg2 + '<br/>'
            }, false)

        socket.on('message', function (msg) {
            content.innerHTML += msg + '<br/>'
        })
    </script>
</body>

</html>
  • 后端:

Server.js

const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server);

//使用express静态文件管理的中间件
app.use(express.static('./public'))

app.get('/', (req, res) => {
    // res.sendFile(__dirname + '/public/index.html');
    res.send('hello')
});

io.on('connection', (socket) => {
    console.log('a user connected');
    socket.on('receive', (data) => {
        console.log(data)
        //开始广播事件
        socket.broadcast.emit('message', data)
    })
});

server.listen(3000, 'localhost', () => {
    console.log('listening on *:3000');
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340