结构:
socket是应用层和传输层的桥梁。(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中)
涉及数据:
socket所涉及的数据是报文,是明文。
作用:
建立长久链接,供网络上的两个进程通信。
nodejs环境下的简单通信。
代码:
serve:
// 1 引入模块
const
net
=
require
(
'net'
);
// 2 创建服务器
let
clientArr
=
[];
const
server
=
net
.
createServer
();
// 3 绑定链接事件
server
.
on
(
'connection'
,(
person
)
=>
{
console
.
log
(
clientArr
.
length
);
// 记录链接的进程
person
.
id
=
clientArr
.
length
;
clientArr
.
push
(
person
);
person
.
setEncoding
(
'utf8'
);
// 客户socket进程绑定事件
person
.
on
(
'data'
,(
chunk
)
=>
{
console
.
log
(
chunk
);
clientArr
.
forEach
((
val
)
=>
{
// 数据写入全部客户进程中
val
.
write
(
chunk
);
})
})
person
.
on
(
'close'
,(
p1
)
=>
{
clientArr
[
p1
.
id
]
=
null
;
} )
person
.
on
(
'error'
,(
p1
)
=>
{
clientArr
[
p1
.
id
]
=
null
;
})
})
server
.
listen
(
800
);
client:
// 1 引入模块
const
net
=
require
(
'net'
);
const
readline
=
require
(
'readline'
);
// 2 创建套接字和输入输出命令行
let
rl
=
readline
.
createInterface
({
// 调用std接口
input:process
.
stdin
,
output:process
.
stdout
})
let
client
=
new
net
.
Socket
();
// 3 链接
client
.
connect
(
800
,
'localhost'
);
client
.
setEncoding
(
'utf8'
);
client
.
on
(
'data'
,(
chunk
)
=>
{
})
client
.
on
(
'error'
,(
e
)
=>
{
console
.
log
(
e
.
message
);
})
// 绑定输io流事件,获取输入输出字符
rl
.
on
(
'line'
,(
mes
)
=>
{
client
.
write
(
mes
);
})
小结:
server端:绑定连接事件 --> 在连接事件中管理客户端进程对象(1,把添加到数组中 2,处理客户端发来的数据)-->开启端口监听请求 。
client端:创建连接服务器用的套接字 --> 连接服务器 。
socket建立的连接是长久连接。而应用层的http协议是3次握手协议,是短连接。
socket工作原理和http类似,只是不规定断开连接的时间。可以把http理解成一个人办一件事情就跑一次连接流程。socket理解成只跑一次连接流程,只到把所有的事情都做完了才回去。