socket,socket.io,mongodb

2023-11-18

Socket
      网络上的程序实现双向的数据链接,这个链接的一端成为socket。
     
     1.Socket是一个持久链接。
     2.Socket是双向通信的。
    
Socket VS ajax轮询
    
    ajax轮询 , 是利用客户端来发送请求,每隔几秒发送一个http请求,服务器压力大。
    Socket不会,一旦链接不会断开,可以实现实时通信。 比如微信的朋友圈更新提示。即时聊天通讯。
基于net模块实现Socket   文档
目标:聊天室;
服务端代码:(net模块)
const net = require ( " net " );
//连接到人会有很多,建立存储。
var clients = [];
//创建服务;
const server = net . createServer ();
    //监听用户链接;
server . on ( " connection " , ( client ) => { //clinet === socket
    //当用户进行连接时给每个用户一个唯一的id;
    client . id = clients . length ;
    //把所有用户放进链接数组中;
    clients . push ( client );
    //设置编码格式;
    client . setEncoding ( " utf8 " );
    //监听客户端是否向服务器发送数据。
    //如果客户端发送数据,那么服务器把数据发送给所有用户;
    client . on ( " data " ,( chunk ) => {
        clients . forEach (( cli , index ) => {
        cli . write ( chunk )
    })
})
// 监听用户是否退出群聊;
// 如果退出就移除用户;
client . on ( " close " ,( client ) => {
    clients [ client . id ] == null ;
})
client . on ( " error " , ( client ) => {
        clients [ client . id ] == null ;
    })
})
server . listen ( 9000 , " localhost " ); //监听端口号;
客户端代码:
const net = require ( " net " );
const readline = require ( " readline " );
const client = new net . Socket ();
const rl = readline . createInterface ({
    input : process . stdin ,
    output : process . stdout
})
//链接服务器
client . connect ( 9000 , " localhost " );
//设置编码格式:
client . setEncoding ( " utf8 " );
//服务器传过来数据,做监听
client . on ( " data " ,( chunk ) => {
    console . log ( chunk );
})
client . write ( " hello world " );
rl . on ( " line " ,( input ) => {
    client . write ( input );
})
tip:因为可恶的防火墙,我们并不能进行数据的通信,但是我们可以在本机进行测试;
目标:完美的聊天室;
webSocket
你猜啥是webSocket?
WS外部模块   源码
 
安装 ws :
$ yarn global add w s
服务器部分
请查看 源码中 Server  example示例
const WebSocket = require ( ' ws ' );
const server = new WebSocket . Server ({ port : 9000 });
const clients = [];
server . on ( ' connection ' , ( client ) => {
    client . id = clients . length ;
    clients . push ( client );
    client . on ( ' message ' , ( chunck ) => {
        clients . forEach (( cli , index ) => {
            cli . send ( chunck );
        })
        console . log ( ' received: %s ' , chunck );
    });
    client . on ( " error " ,() => {
        clients [ client . id ] = null ;
    })
    client . on ( " close " , () => {
        clients [ client . id ] = null ;
    })
});
前端部分:
Tip:前端的高级浏览器全部都有WebSocket对象,可以方便的进行使用。
<! 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 > 聊天室 </ title >
</ head >
< body >
< input type = " text " id = " input " >
< button id = " btn " > 提交 </ button >
< div id = " content " >
</ div >
< script >
var client = new WebSocket ( " ws:localhost:9000 " );
var button = document . getElementById ( " btn " );
var input = document . getElementById ( " input " );
var content = document . getElementById ( " content " );
client . onmessage = function ( e ){
console . log ( e );
content . innerHTML = e . data ;
}
button . onclick = function (){
client . send ( input . value );
}
< / script >
</ body >
</ html >
Socket.io   官网
Mongodb
想想你现在学了啥, 能干啥?node好神奇啊,可以调用系统API,可以建立文件,获取数据,那么现在我们是不是可以把前端的数据转存成文件了~ 
可是你转存成的文件大概是啥样的那?
当然有人帮你整理文件,整理成非常专业好看的模样,现在的数据库大概可以分成两个类型,   关系型数据库 面向对象数据库
关系型数据库 : 二维表 。
啥,听不懂? 其实就是excle
第二类no-sql数据库:没有sql语句的数据库。 这货是存json的数据库。
好了正式开始我们 MongoDB的学习:
国际惯例先上logo:
windows系统下安装mongoDB
下载mongoDB ,官网速度十分感人。
可视化工具,用不用无所谓了~ 
安装之后再c盘建立文件夹
C:\data\db
然后运行
> mongo —dbpath c:\data\db
进入mongo界面说明安装成功;
Mac 就用brew 吧~
Brew update
Brew install mongodb
启动Mongodb 用  brew services start mongodb 
就可以了,关闭数据库怎么办呐? 你猜啊
进入 mongodb 操作指令的事 mongo
Mongo 配置文件的位置 在 /usr/local/etc/mongod.conf 下可以通过 cat指令查看, windows 用户就直接在文件夹中搜索就行了~
这是配置文件内容:
systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb   这是说明了数据库存储位置
net:
  bindIp: 127.0.0.1  
mongodb特性
一句话解释:MongoDB是一个基于分布式文件存储的数据库。 由C++编写。旨在为web程序提供可扩展性高的高性能的数据存储解决方案。
mongo大概长这样:
mongo可以创建无限多个数据库。
数据库就一定有数据类型
mongo命令合集
查看数据库列表 $ Show dbs   检查数据库
创建数据库    $ use 数据库名称
创建集合     $ db.createCollection(“集合名”)   // 集合 === 表
            >{ok:1}
查看集合(一定先进入对应数据库再进行查看)
            $  db.getCollectionNames()
            >[‘集合名']
插入数据     $ db.集合名.insertOne(数据集合({}json形式的数据)) // 文档 === 列
            > {
                "acknowledged" : true,   //是否插入成功
                  "insertedId" : ObjectId("5aab2aaa93468a71aec836ce”)//插入的id
             }
查看数据    $  db.music.find() 查看数据库中的数据
           > 
            { "_id" : ObjectId("5aab2aaa93468a71aec836ce"), "title" : "回娘家" }
            { "_id" : ObjectId("5aab2b5e93468a71aec836cf"),  "title" : "再见理想" }
Help命令 
db.help()   //db下的指令
db.test.help(); // db.test 下的所有指令
db.test.find().help(); //db.test.find下的所有指令
………强大的help指令
使用数据库
use  数据库名
查询数据陆
show dbs
查看当前使用的数据库
db/db.getName();
显示当前的数据库状态
db.stats();
查看当前db的版本
db.version();
查看数据库连接地址;
db.getMongo()
删除数据库
db.dropDatabase() 
tip:删除当前使用的数据库。
集合(collection)操作
1.创建
createCollection(“collName”,{size:20,cappeu:true,max:10})
2.得到指定名称的集合 
db.getCollection(“account”)
3.得到当前db所有的集合;
db.getCollectionNames()
4.显示当前db所有集合状态
db.printCollectionStats();
5.删除集合
db.COLLECTION_NAME.drop();
集合数据操作(添加,修改,删除)update | updateMany()
1.添加 insert([,…]|{key:value,...})
db.users.save({name:”zhangsan”,”age”:25,sex:true})
2.修改 updata(条件({}))
db.users.update({age:25},{$set:{name:”changeName”}},false,true)
相当于sql语句的  update users set name = “changeName” where age = 25;
db.users.update({name:”Lisi”},{$inc:{age:50}},false,true)
相当于sql语句的  update users set age = age + 50 where name =“lisi”
db.users.update({name:”Lisi”},{$inc:{age:50},$set:{name:’hoho’}},false,true)
相当于sql语句的 : update users set age = age + 50 ,name = ‘hoho’ where name = “lisi"
3.删除
db.users.remove({age:132})
db.users.delete()
db.users.deleteOne()
db.users.deleteMany()
豆瓣数据的操作:
    获取到豆瓣的数据,然后将数据放入数据库之中。 
    查找对应数据;
db.movie.find(条件,显示内容)
db.movie.find({year:1994},{title:1,year:1,_id:0})//表示显示 title1 和 year1 _id不显示;
1.表示显示  0.表示不显示;
排序
根据评分排序:
db.movie.find({},{title:1,year:1,_id:0,'rating.average':1}).sort({'rating.average':-1})
条件判断:$gt 大于; $lt 小于; $gte 大于等于 $lte 小于等于;
db.movie.find({‘arting.average’:$gt:9.5},{title:1,year:1,_id:0,'rating.average':1}).sort({'rating.average':-1})
分类筛选:
$in 包含  $nin 不包含
db.movie.find({genres:{$in:["犯罪","剧情"]}},{title:1,year:1,_id:0,'rating.average':1}).sort({'rating.average':-1})
可视化工具:
nodejs + mongo
链接数据库:
var MongoClient = require ( ' mongodb ' ). MongoClient ;
MongoClient . connect ( url , function ( err , db ) {
if ( err ) throw err ;
console . log ( " 数据库已创建! " );
db . close ();
});
创建数据库操作对象:
var dataBase = db . db ( " test " );
dataBase . createCollection ( " coll " , function ( err , res ){
if ( err ) throw err ;
console . log ( " 创建集合 " );
db . close ();
})
数据库操作collection 
dataBase . collection ( " coll " ). insert ( {} ,() => {
})
数据库查询操作:
dbo . collection ( " coll " ). find ({}). toArray ( function ( err , result ) { // 返回集合中所有数据
if ( err ) throw err ;
console . log ( result );
db . close ();
});
数据库更新操作:
dbo . collection ( coll " ). update ( whereStr , updateStr , function ( err , res ) {
    if ( err ) throw err ;
        console . log ( " 文档更新成功 " );
     db . close ();
});
数据库删除操作:
dbo . collection ( " coll " ). deleteOne ( whereStr , function ( err , obj ) {
    if ( err ) throw err ;
    console . log ( " 文档删除成功 " );
    db . close ();
});
limt方法:
dbo . collection ( coll " ). find (). limit ( 2 ). toArray ( function ( err , result ) {
    if ( err ) throw err ;
        console . log ( result );
    db . close ();
});
skip方法:
dbo . collection ( " site " ). find (). skip ( 2 ). limit ( 2 ). toArray ( function ( err , result ) {
    if ( err ) throw err ;
    console . log ( result );
    db . close ();
});
删除集合
dbo . collection ( " test " ). drop ( function ( err , delOK ) { // 执行成功 delOK 返回 true,否则返回 false
    if ( err ) throw err ;
    if ( delOK ) console . log ( " 集合已删除 " );
    db . close ();
});
用 brew 启动mongo
brew services start mongodb 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket,socket.io,mongodb 的相关文章

随机推荐

  • SSD目标检测流程深入理解

    前言 SSD是经典的一阶目标检测网络框架 特点是速度快 网络简洁 主要思想 1 数据增强 包括光学变换和几何变换 2 网络骨架 SSD在VGG基础上延伸了4个卷积模块 生成不同尺度的特征图 3 PriorBox与多层特征图 在不同尺度设置预
  • 转置卷积(Transposed Convolution)

    文章目录 前言 卷积操作 转置卷积操作 Pytorch中的转置卷积参数 Pytorch转置卷积实验 前言 转置卷积 Transposed Convolution 在语义分割或者对抗神经网络 GAN 中比较常见 其主要作用就是做上采样 UpS
  • 常用电子元件介绍与功能

    常用电子元件简介及其作用 一 电容 1 种类 1 CBB电容 2 铝电解电容 3 钽电解电容 4 高频瓷片电容 5 低频瓷片电容 2 作用 1 去耦 2 滤波器 3 储能 4 检波 5 无源晶振 6 隔直通交 3 总结 二 电感 1 种类
  • 设计分享

    wechat 嵌入式工程师成长日记 https mp weixin qq com s biz Mzg4Mzc3NDUxOQ mid 2247484191 idx 1 sn ceb08f232c86a8da9aa78e6c3fa97e6f c
  • 【JUC并发编程】CopyOnWrite容器详解

    JUC并发编程 CopyOnWrite容器详解 文章目录 JUC并发编程 CopyOnWrite容器详解 一 什么是CopyOnWrite容器 二 CopyOnWriteArrayList 三 CopyOnWrite的业务中实现 一 什么是
  • AD18间距规则设置注意情况(Custom Query)

    在AD18中设置器件间距规则时 通常只能一个器件一个器件地设置 而不能同时设置的原因可能是因为在设置器件间距时 需要考虑到每个器件的具体位置和布局情况 以及器件之间的相互影响 在PCB设计中 器件间距规则是用来确保器件之间有足够的间隔 以避
  • 计算机在智慧交通的应用论文,智能交通的毕业论文

    智能交通的毕业论文 智能运输系统的研究许多国家都投入了巨大的人力和物力 并成为继航空航天 军事领域之后高新技术应用最集中的领域 下面为大家分享了有关智能交通的论文 欢迎欣赏 摘 要 八十年代以来 世界一些发达国家纷纷投入智能交通系统 ITS
  • 指令与指令系统

    一 指令中的操作数 二 指令的寻址方式 具体如下 段地址怎么看 判断它是数据段还是堆栈段还是附加段 如果是数据段 段地址的值为DS的值 其他的以此类推 见上图最后的内容
  • Java JWT: JSON Web Token

    Java JWT JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand library for creating and
  • C++之string类型详解

    参考 C 之string类型详解 云 社区 腾讯云 目录 1 声明一个C 字符串 2 字符串操作函数 2 1 C 字符串和C字符串的转换 2 2 大小和容量函数 2 3 元素存取 2 4 比较函数 2 5 更改内容 2 6 提取子串和字符串
  • eclipse导入项目后出现红色叉号的解决方案

    对于一名程序员来说 我导入的项目在项目的名称上无端加了一个红色的叉号 虽然这个不友好的符号 对于我整个的项目运行没有任何影响 但是总让我觉得不舒服 大大的叉号写在我的项目的脑袋上 我心里能舒服吗 于是我在百度上找到了这篇博文 原文如下 既然
  • 用java实现二叉树的前序遍历(递归和迭代)

    目录 1 题目内容 2 用递归实现前序遍历 2 1解题思路 2 2代码 3 用迭代实现前序遍历 3 1解题思路 3 2代码 1 题目内容 给你二叉树的根节点 root 返回它节点值的 前序 遍历 示例 1 输入 root 1 null 2
  • leaflet地图原理_leaflet地图框架

    L Map API各种类中的核心部分 用来在页面中创建地图并操纵地图 使用 example initialize the map on the map div with a given center and zoom var map L m
  • tensorflow keras 双向lstm gru的水库水位预测 完整代码+数据 毕业设计

    项目演示 https www bilibili com video BV1RP411f7tn spm id from 333 999 0 0 附完整代码 结果演示
  • 基于STM32单片机水质检测PH值检测电导率TDS检测超声波水位检测

    系统功能设计 末尾附文件 本系统由STM32单片机核心板 超声波测距模块 PH值传感器模块 电导率传感器 LCD1602液晶及电源组成 1 超声波传感器采集探测距离 PH传感器采集PH值 PH传感器需要根据手册校准 电导率传感器采集液体电导
  • 连接远程ssh老是掉线解决办法

    1 问题描述 ssh 连接vps的远程服务器 连接一段时间自动断开 包括正在输入命令 执行命令的情况 开着代理的话特别容易断开 关闭代理有效解决问题 2 解决方法 最合适的方法 打开 sudo vim etc ssh sshd config
  • unity制作血条

    unity制作血条 在hierarchy中create gt UI gt image 重命名为border 将血条框拖入Source Image Set Native Size 防止变形 在Canvas下create empty 命名为He
  • 反编译 APK 的基本步骤

    文章目录 反编译 APK 的基本步骤 1 编写一个简单的安卓 app 2 将 release app apk 解压缩 3 将 classes dex 文件反编译为 jar 文件 4 使用 jd gui 可视化阅读 classes dex2j
  • 测试用例之支付功能测试点整理【建议收擦】

    一 梳理支付的业务流程如下 点击支付 gt 选择支付方式 gt 确认金额 gt 输入密码 gt 成功支付 完成这个流程测试 也就是完成了项目的冒烟测试 然后需要测试针对流程中的每个阶段和步骤 具体分析可能导致异常的测试点 所以我们按阶段和输
  • socket,socket.io,mongodb

    Socket 网络上的程序实现双向的数据链接 这个链接的一端成为socket 1 Socket是一个持久链接 2 Socket是双向通信的 Socket VS ajax轮询 ajax轮询 是利用客户端来发送请求 每隔几秒发送一个http请求