socket,socket.io,mongodb

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 

猜你喜欢

转载自blog.csdn.net/zuggs_/article/details/80757587