Socket
网络上的程序实现双向的数据链接,这个链接的一端成为socket。
1.Socket是一个持久链接。
2.Socket是双向通信的。
Socket VS ajax轮询
ajax轮询 , 是利用客户端来发送请求,每隔几秒发送一个http请求,服务器压力大。
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 :
$ 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
>
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