【Node】Node实现网络编程

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 }`); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南栀~zmt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值