文章目录
TCP
TCP基础
TCP协议:传输控制协议,提供面向连接的、可靠的数据传输服务
- 面向连接:数据传输之前,客户端与服务器端要建立连接
- 可靠的:数据传输是有序的、要对数据进行校验
Scoket:网络套接字,是进行网络连接的数据结构(服务器的Socket和客户端的Socket)
- 服务器的Socket:实现对指定端口号的监听,若有客户端向监听的端口发出连接请求,Socket就会监听到
- 客户端的Socket:向服务器端发送请求
TCP数据分组称为段(Segment)。TCP将来自应用层的数据进行分块并封装成TCP段进行发送。
TCP连接的建立采用三次握手方法。
Socket之间的连接过程包括以下3个步骤。
- 服务器监听。服务器端Socket处于等待连接的状态,实时监控网络状态。
- 客户端请求。客户端Socket提出连接请求,要连接的目标是服务器端的Socket。
- 连接确认。
net模块提供的API
Node中的net模块:实现TCP的连接和服务,封装了大多数的类和方法,方便用户使用TCP进行网络连接
导入该模块:
const net = require('net');
net.Server类: 服务器类,用于创建TCP服务器
创建net.Server对象:
const server = new net.Server([options][, connectionlistener])
const server = net.createServer([参数])
返回一个net.Server类的实例(对象)。
该方法可以创建一个TCP服务器,是创建net.Server对象的快捷方式。
用法:
net.createServer([options][, connectionlistener])
net.Server类实现的事件:
close
:当服务器关闭时被触发。如果有连接存在,则直到所有连接结束才会触发这个事件。connection
:当一个新的连接建立时被触发,Socket是一个net.Socket的实例对象。error
:发生错误时被触发。listening
:当服务被绑定后调用server.listen()方法。
net.Server类提供的方法:
server.address()
方法用于返回绑定的ip地址、地址族和服务端口。server.close()
方法使服务器停止接受建立新的连接并保持现有的连接server.listen()
方法用来启动一个服务器来监听连接。
net.Socket: 客户端类,用于创建TCP客户端
创建net.Socket对象:
const client = net.Socket([options])
net.Socket类实现的事件:
close
:当Socket完全关闭时发出该事件。connect
:当一个Socket连接成功建立时触发该事件。data
:当接收到数据时触发该事件。drain
:当写入缓冲区变为空时触发该事件。end
:当Socket的另一端发送一个FIN包时触发该事件,从而结束Socket的可读端。error
:当错误发生时触发该事件。close事件也会紧接着该事件被触发。ready
:当Socket准备使用时触发该事件。connect事件发生后立即触发该事件。timeout
:当Socket超时时触发该事件。
net.Socket类提供的方法:
socket.connect()
:用于在指定的Socket上启动一个连接。socket.write()
:用于在Socket上发送数据。
net.createConnection()方法
:
- 返回启动连接的net.Socket对象。
- 当连接建立之后,在返回的Socket上将触发一个connect事件。
- 语法格式:
net.createConnection(options[, connectListener])
net.createConnection(port[, host][, connectListener])
Node实现TCP
创建服务器端:
// 导入net模块
const net = require('net');
// 创建TCP服务器
const server = net.createServer((client) => {
//'client'表示的客户端
let clientNo = 0; // 为每个连接到服务器的客户顿编号
console.log(clientNo+'号客户端已经连接');
// 绑定'end'事件:客户端断开连接时触发
client.on('end',function() {
console.log(clientNo+'号客户端断开连接!');
})
client.write(clientNo+'号客户端,你好!');
client.pipe(client);
// 绑定'data'事件,接收客户端的数据时触发
client.on('data',(data => {
console.log(clientNo+'号客户端发送的数据是:'+data.toString());
}))
});
// 绑定'error'事件:当连接发生错误时触发
server.on('error',(err => {
throw err;
}))
// 启动监听:指定监听的端口号
server.listen(8000,() => {
console.log('TCP服务器已经启动了!!!');
})
创建客户端:
const net = require('net');
//创建TCP客户端
var client = net.Socket();
//连接服务器:调用connect方法
client.connect(8000,'127.0.0.1',()=> {
console.log('已经连接到服务器');
client.write('我是TCP客户端'); //向服务器发送数据
})
//接收服务器端数据:绑定'data'事件
client.on('data',(data)=> {
console.log('接收的服务器端数据:'+data.toString());
})
//绑定'end'事件
client.on('end',()=> {
console.log('结束结束数据!');
})
UDP
UDP基础
UDP协议:用户数据报协议,提供的是不可靠的、面向无连接的传输服务(只有数据的发送方和接收方)
- 面向无连接:在传输数据之前没有明确的连接链路(即不是所有的数据都是通过一条链路传输)
- 不可靠的:因为数据传输不是通过一条链路完成的,因此接收方接收的数据不一定是按发送的顺序接收,这样就可能造成数据包的丢失
- UDP传输给IP的数据单元称作UDP数据报(Datagram)。
- UDP使用端口号为不同的应用保留其各自的数据传输通道。UDP使用Socket,只不过是无连接的数据报Socket。
dgram模块
dgram核心模块用于实现UDP通信。
导入该模块:
const dgram = require('dgram');
dgram.Socket类
- dgram.Socket类提供实现UDP应用的基本框架。
- dgram.Socket对象是一个封装了数据报功能的事件触发器。
- dgram.Socket实例由dgram.createSocket()方法创建。
dgram.Socket类实现的事件:
close
:使用close()方法关闭一个Socket之后触发该事件。error
:发生任何错误都会触发该事件。listening
:当一个Socket开始监听数据报信息时触发该事件。message
:当有新的数据报被Socket接收时触发该事件。
dgram.Socket类提供的方法:
socket.bind()
方法用于设置Socket在指定的端口和地址上监听数据报信息。socket.send()
方法用于在Socket上发送一个数据报。
dgram.createSocket()方法
- 该方法用于创建dgram.Socket对象。一旦创建了Socket,调用socket.bind()方法会指示Socket开始监听数据报消息。
- 基本用法:dgram.createSocket(options[, callback])
- 创建一个特定类型的dgram.Socket对象:dgram.createSocket(type[, callback])
Node实现UDP
服务器:
// 导入dgram模块
const dgram = require('dgram');
// 创建dgram.Socket对象(服务器端---数据的接收端)
const server = dgram.createSocket('udp4');
// 绑定'error'事件
server.on('error',(err => {
console.log(`服务器异常:${
err.stack}`);
}))
// 绑定'message'事件:参数msg客户端发送的数据,
// 参数rinfo封装了客户端的信息(包括地址、端口号等)
server.on('message',((msg,rinfo) => {
var str_msg = msg.toString();
console.log(`服务器接收来自:${
rinfo.address}:${
rinfo.port}的${
str_msg}`);
console.log(rinfo);
//将接收到的消息返回给客户端
server.send('南栀',rinfo.port,rinfo.address);
}))
// 注册监听
server.on('listening',() => {
// 获取服务器端的地址
var server_address = server.address();
console.log(`服务器监听:${
server_address.address}:${
server_address.port }`);