O uso do módulo net do nodejs

netA 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 tcpou ipcservidor 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 TCPou 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.
insira a descrição da imagem aqui

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('数据发送成功')
})

Acho que você gosta

Origin blog.csdn.net/woyebuzhidao321/article/details/131494461
Recomendado
Clasificación