net
A comunicação ipc subjacente do vscode é encapsulada com base no módulo node.Hoje vou explicar aproximadamente o uso do módulo net.
Endereço oficial do documento: https://nodejs.cn/api/net.html
O papel do módulo net
O módulo net fornece a capacidade de criar tcp
ou ipc
servidor e cliente de maneira baseada em fluxo.
O módulo node:net fornece uma API de rede assíncrona para criar servidores baseados em fluxo TCP
ou IPC ( net.createServer() ) e clientes ( net.createConnection() ).
Introdução ao TCP e IPC
O modelo de referência OSI divide as funções de comunicação de rede em 7 camadas, ou seja, camada física, camada de enlace de dados, camada de rede, camada de transporte, camada de sessão, camada de apresentação e camada de aplicação. O protocolo TCP é um protocolo na camada de transporte.
TCP
TCP: Transmission Control Protocol, que pode se comunicar entre processos na mesma máquina ou máquinas diferentes ou sistemas operacionais diferentes.
recursos tcp
- Conexão orientada
Orientado à conexão : significa que uma conexão deve ser estabelecida com a outra parte antes da comunicação formal; é também o chamado aperto de mão de três vias.
O principal objetivo do handshake de três vias é sincronizar o envio e o recebimento de pacotes de dados.
O processo geral do handshake de três vias : 1. O cliente A envia um pacote de solicitação de conexão para o host B; 2. O host B envia um pacote para o cliente A concordando em conectar e solicitar a sincronização; 3. O cliente A envia outro pacote para confirmar com a sincronização do host B.
-
de ponta a ponta
-
confiável
- Os dados do aplicativo são segmentados em blocos de dados que o TCP considera mais apropriados para enviar
- Quando o TCP envia um segmento de mensagem, ele inicia um cronômetro e espera que o destino confirme o recebimento do segmento de mensagem; se não puder receber uma confirmação a tempo, ele reenviará o segmento de mensagem.
- Quando o TCP recebe dados do outro lado da conexão TCP, ele envia uma confirmação. Este reconhecimento não é enviado imediatamente, é adiado.
- O TCP manterá uma soma de verificação de seu cabeçalho e dados. Esta é uma soma de verificação de ponta a ponta para detectar quaisquer alterações nos dados em trânsito. Se a soma de verificação do segmento recebido estiver incorreta, o TCP descartará o segmento e esperará que o remetente o reenvie.
- Como os segmentos TCP são transmitidos como pacotes IP e os datagramas IP podem chegar fora de ordem, os segmentos TCP também podem chegar fora de ordem. Se necessário, o TCP reordenará os dados recebidos. ordem. No entanto, os datagramas IP serão duplicados e a extremidade receptora do TCP descartará os dados duplicados.
- O TCP também pode executar o controle de fluxo. Cada parte da conexão TCP possui um espaço de buffer de tamanho fixo, e o receptor TCP permite apenas que o remetente da outra parte envie dados que possam ser acomodados no buffer do receptor.
IPC
IPC: (Inter Process Communication) é a comunicação entre processos, que só pode se comunicar entre diferentes processos na mesma máquina e não pode cruzar máquinas físicas!!
Construir um servidor TCP
No processo de criação de uma sessão entre o servidor TCP e o cliente, o servidor e o cliente fornecem um soquete (soquete) respectivamente, e esses dois soquetes formam uma conexão juntos. O servidor e o cliente realizam a operação de conexão entre os dois através do soquete.
net.createServer([opções][, connectListener])
-
opções: objeto
-
alloHalfOpen: booleano, o padrão é falso, então quando o final legível terminar, o soquete terminará automaticamente o final gravável;
-
pauseOnConnect: booleano, padrão falso, indica se o soquete deve ser pausado nas conexões de entrada
-
connectLisetener: Função que é uma função de retorno de chamada quando o cliente estabelece uma conexão com o servidor. Esta função de retorno de chamada toma como parâmetro o objeto socket port
-
rede de retorno.Servidor
import net from 'net';
const server = net.createServer((socket) => {
console.log('client connect')
/***********************net.Socket事件*******************************/
// 接收到数据时触发。
socket.on('data', (data) => {
console.log(data.toString())
})
// 当成功建立套接字连接时触发。
socket.on('connect', () =>{
console.log('套接字建立成功')
})
// 当写缓冲区变空时触发。
socket.on('drain', () => {
})
// 当套接字的另一端表示传输结束时触发,从而结束套接字的可读端。
socket.on('end', () => {
console.log('数据接受完毕')
})
// 发生错误时触发,close事件将在此事件之后直接调用
socket.on('error', (err) => {
console.log(err)
})
// 一旦套接字完全关闭就触发
socket.on('close', (hasError) => {
// 参数 hadError 是布尔值,表示套接字是否由于传输错误而关闭。ture则表示由于传输错误而导致关闭
})
})
/***************************net.Server 属性*****************************/
// 最大连接数字,设置此属性以在服务器的连接计数变高时拒绝连接。
server.maxConnections = 6;
/***************************net.Server事件******************************/
// 建立新连接时触发
server.on('connection', (socket) => {
})
// 发生错误时触发
server.on('error', (err) => {
})
// 服务器关闭时触发
server.on('close', () => {
})
/****************************net.Server方法*******************************/
// 异步获取服务器上的并发连接数
server.getConnections((err, count) => {
if (err) return
console.log(count)
})
// 获取监听地址端口参数信息
const address = server.address();
// 绑定监听端口
server.listen(8124, () => {
console.log('TCP Server is runing')
})
// 停止服务器接受新连接并保持现有连接。
server.close((err) => {
// 该函数是异步的,当所有连接都结束并且服务器触发 'close' 事件时,则服务器最终关闭。
// 如果服务器在关闭时未打开,它将以 Error 作为唯一参数被调用。
})
Crie um cliente TCP
net.createConnection()
import net from 'net';
// 创建新的 net.Socket,并立即使用 socket.connect() 发起连接,然后返回启动连接的 net.Socket。
// 建立连接后,将在返回的套接字上触发 'connect' 事件。 最后一个参数 connectListener(如果提供)将作为 'connect' 事件的监听器添加一次。
const client = net.createConnection({
port: 8124, // 端口
host: '11.11.11.12', // 服务地址,默认localhost
}, () => {
console.log('连接成功')
})
/*********************net.Socket 属性*************************/
// 接受的字节数
client.bytesRead = 1024;
// 发送的字节数
client.bytesWritten = 2048;
// 返回本地IP地址的字符串表示
client.localAddress
// 返回本地端口
client.localPort
// 远程 IP 地址的字符串表示形式
client.remoteAddress
// 远程 IP 系列的字符串表示形式。 'IPv4' 或 'IPv6'。
client.remoteFamily
// 远程端口的数字表示
client.remotePort
/*********************net.Socket 事件*************************/
// 连接server成功后触发
client.on('connect', () => {
})
// 接收到数据时触发
client.on('data', (data) => {
console.log(data.toString())
})
// 当套接字的另一端表示传输结束时触发,从而结束套接字的可读端。
client.on('end', () => {
})
// 当写缓冲区变空时触发。 可用于限制上传。
client.on('drain', () => {
})
// 当套接字准备好使用时触发。
client.on('ready', () => {
})
// 如果套接字因不活动而超时则触发。
client.on('timeout', () => {
// 这只是通知套接字已空闲。 用户必须手动关闭连接。
client.destroy() // 关闭连接
})
// 发生错误时触发。 'close' 事件将在此事件之后直接调用。
client.on('error', (err) => {
console.log(err)
})
/*********************net.Socket 方法********************************/
// 销毁流并关闭连接。
client.destroy()
// 在给定的套接字上发起连接。
client.connect()
// 获取连接地址信息
client.address()
// 关闭socket,可传入数据,在关闭之前再write一次数据
client.end(data, () => {
console.log('连接已关闭')
})
// 暂停读取数据
client.pause()
// 继续读取数据
client.resume()
// 为data事件中的datastream统一设置编码
client.setEncoding('utf8');
// 设置套接字超时事件
client.setTimeout(3000);
// 在套接字上发送数据。 第二个参数指定字符串情况下的编码。 它默认为 UTF8 编码。
client.write(data, (err) => {
if (err) return;
console.log('数据发送成功')
})