>  기사  >  웹 프론트엔드  >  TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

青灯夜游
青灯夜游앞으로
2021-09-24 10:28:047888검색

TCP 네트워크 통신에 Node.js를 어떻게 사용하나요? 다음 기사는 TCP 네트워크 통신에 Node.js를 사용하는 방법을 이해하는 데 도움이 될 것입니다.

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

요약: 네트워크는 통신과 상호 연결의 기초입니다. Node.js는 각각 TCP, HTTP 및 UDP 통신을 구현하는 데 사용되는 net, http 및 dgram과 같은 모듈을 제공합니다. Node.js를 사용한 TCP 통신 일부 실습 기록. [추천 학습: "nodejs 튜토리얼"]

1. TCP 서버 구축

1.1 Node.js를 사용하여 TCP 서버를 생성하려면

TCP 서버를 사용하려면 먼저 require('net')를 호출하여 net 모듈을 로드한 다음 net 모듈의 createServer 메서드를 호출해야 TCP 서버를 쉽게 생성할 수 있습니다. 구문 형식은 다음과 같습니다.

net.createServer([options][, connectionListener])
options是一个对象参数值,有两个布尔类型的属性allowHalfOpen和pauseOnConnect。这两个属性默认都是false;
connectionListener是一个当客户端与服务端建立连接时的回调函数,这个回调函数以socket端口对象作为参数。

1.2 . 클라이언트 연결 모니터링

TCP 서버 사용하기 메소드는 클라이언트 연결 모니터링을 시작할 수 있습니다. 구문 형식은 다음과 같습니다:

server.listen(port[, host][, backlog][, callback]);
port:为需要监听的端口号,参数值为0的时候将随机分配一个端口号;
host:服务器地址;
backlog:连接等待队列的最大长度;
callback:回调函数。

다음 코드는 TCP 서버를 생성하고 포트 8001을 수신할 수 있습니다:

//引入net模块
const net = require('net');
//创建TCP服务器
const server = net.createServer(function (socket) {
    console.log('有新的客户端接入');
});
//设置监听端口
server.listen(8001, function () {
    console.log('服务正在监听中。。。')
});

Run 이 코드를 보면 그림과 같이 콘솔에서 Listen 메소드를 실행하는 콜백 함수를 볼 수 있습니다.

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

해당 TCP 클라이언트 또는 디버깅 도구를 사용하여 생성된 이 TCP 서버에 연결할 수 있습니다. 예를 들어 Windows Telnet을 사용하려는 경우 다음 명령을 사용하여 연결할 수 있습니다.

telnet localhost 8001

연결에 성공한 후 콘솔에 "New client access"라는 단어가 인쇄되는 것을 볼 수 있습니다. createServer 메소드가 실행되어 생성된 TCP 서버에 성공적으로 연결되었음을 나타냅니다.

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

server.listen() 메소드는 실제로 서버에서 청취 이벤트를 트리거하므로 청취 이벤트를 수동으로 모니터링할 수도 있습니다.

//设置监听端口
server.listen(8001);
//设置监听时的回调函数
server.on('listening', function () {
    console.log("服务正在监听中。。。")
});

청취 이벤트 외에도 TCP 서버도 있습니다. 다음 이벤트를 지원합니다.

connection:当有新的链接创建时触发,回调函数的参数为socket连接对象。
close:TCP服务器关闭的时候触发,回调函数没有参数。
error:TCP服务器发生错误的时候触发,回调函数的参数为error对象。

다음 코드는 net.Server 클래스를 사용하여 TCP 서버를 생성하고 위 이벤트를 추가합니다.

//引入net模块
const net = require('net');
//实例化一个服务器对象
const server = new net.Server();
//监听connection事件
server.on('connection', function (socket) {
    console.log('有新的客户端接入');
});
//设置监听端口
server.listen(8001);
//设置监听时的回调函数
server.on('listening', function () {
    console.log('服务正在监听中。。。');
});
//设置关闭时的回调函数
server.on('close', function () {
    console.log('服务已关闭');
});
//设置出错时的回调函数
server.on('error', function (err) {
    console.log('服务运行异常', err);
});

1.3 서버가 수신 대기 중인 주소를 봅니다.

TCP 서버의 경우 server.address() 메서드를 사용할 수 있습니다. TCP 서버가 모니터링하는 주소를 확인하고 JSON 객체를 반환하는 메서드입니다. 이 메서드는 TCP 서버가 모니터링하는 주소 정보를 반환하므로 server.listen이 호출되어야 합니다. () 메소드가 호출되거나 이벤트 수신 시 콜백 함수가 메소드에 바인딩됩니다. 이 개체의 속성은 다음과 같습니다.

port:TCP服务器监听的端口号;
family:说明TCP服务器监听的地址是IPv6还是IPv4;
address:TCP服务器监听的地址。

코드는 다음과 같습니다.

//引入net模块
const net = require('net');
//创建TCP服务器
const server = net.createServer(function (socket) {
    console.log('有新的客户端接入');
});
//设置监听端口
server.listen(8001);
//设置监听时的回调函数
server.on('listening', function () {
    //获取地址信息
    let address = server.address();
    //获取地址详细信息
    console.log("服务器监听的端口是:" + address.port);
    console.log("服务器监听的地址是:" + address.address);
    console.log("服务器监听的地址类型是:" + address.family);
});

실행 결과는 다음과 같습니다.

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

1.4서버에 연결된 클라이언트 수

TCP 서버의 경우 server.getConnections() 메소드를 사용하여 이 TCP 서버에 연결된 클라이언트 수를 가져올 수 있습니다. 이 메소드는 비동기 메소드입니다. 콜백 함수에는 두 개의 매개변수가 있습니다.

第一个参数为error对象。
第二个参数为连接TCP服务器的客户端数量。

연결 수를 가져오는 것 외에도 TCP 서버의 maxConnections 속성을 설정하여 이 TCP 서버의 최대 연결 수를 설정할 수도 있습니다. 연결 수가 최대 연결 수를 초과하면 서버는 새 연결을 거부합니다. 다음 코드는 이 TCP 서버의 최대 연결 수를 3으로 설정합니다.

//引入net模块
const net = require('net');
//创建TCP服务器
const server = net.createServer(function (socket) {
    console.log('有新的客户端接入');
    //设置最大连接数量
    server.maxConnections = 3;
    server.getConnections(function (err, count) {
        console.log("当前连接的客户端个数为:" + count);
    });
});
//设置监听端口
server.listen(8001, function () {
    console.log("服务正在监听中。。。")
});

이 코드를 실행하고 여러 클라이언트와 연결해 보세요. 클라이언트 연결 수가 3을 초과하면 그림과 같이 새 클라이언트가 서버에 연결할 수 없음을 알 수 있습니다.

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

1.5 클라이언트

createServer 메소드에서 보낸 데이터를 가져옵니다. 콜백 함수 매개변수는 net.Socket 객체(서버가 수신하는 포트 객체)입니다. 이 객체에는 TCP 서버에 바인딩된 주소를 얻는 데 사용되는 address() 메서드도 포함되어 있습니다. 포트, 가족 및 주소 속성. 클라이언트가 보낸 스트림 데이터는 소켓 객체를 통해 얻을 수 있으며, 데이터가 수신될 때마다 데이터 이벤트가 발생하며, 이 이벤트를 수신하여 콜백 함수에서 코드를 얻을 수 있습니다.

//引入net模块
const net = require('net');
//创建TCP服务器
const server = net.createServer(function (socket) {
    //监听data事件
    socket.on("data", function (data) {
        //打印数据
        console.log("接收到数据:" + data.toString());
    });
});
//设置监听端口
server.listen(8001, function () {
    console.log("服务正在监听中。。。")
});

테스트 결과는 다음과 같습니다.

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

소켓 객체에는 데이터 이벤트 외에도 connect, end, error, timeout 및 기타 이벤트가 있습니다.

1.6. 클라이언트에 데이터 보내기

调用socket.write()可以使TCP服务器发送数据,这个方法只有一个必需参数,就是需要发送的数据;第二个参数为编码格式,可选。同时,可以为这个方法设置一个回调函数。当有用户连接TCP服务器的时候,将发送数据给客户端,代码如下:

//引入net模块
const net = require('net');
//创建TCP服务器
const server = net.createServer(function (socket) {
    //设置消息内容
    const message = "Hello Client......";
    //发送数据
    socket.write(message, function () {
        const writeSize = socket.bytesWritten;
        console.log("数据发送成功,数据长度为:" + writeSize);
    });

    //监听data事件
    socket.on("data", function (data) {
        const readSize = socket.bytesRead;
        //打印数据
        console.log("接收到数据为:" + data.toString(), ";接收的数据长度为:" + readSize);
    });
});
//设置监听端口
server.listen(8001, function () {
    console.log("服务正在监听中。。。")
});

测试结果如下:

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

在上面这段代码中还用到了socket对象的bytesWritten和bytesRead属性,这两个属性分别代表着发送数据的字节数和接收数据的字节数。除了上面这两个属性外,socket对象还有以下属性:

socket.localPort:本地端口的地址;
socket.localAddress:本地IP地址;
socket.remotePort:进程端口地址;
socket.remoteFamily:进程IP协议族;
socket.remoteAddress:进程IP地址。

2、构建TCP客户端

Node.js在创建一个TCP客户端的时候同样使用的是net(网络)模块。

2.1、使用Node.js创建TCP客户端

为了使用Node.js创建TCP客户端,首先要调用require(‘net’)来加载net模块。创建一个TCP客户端只需要创建一个连接TCP客户端的socket对象即可:

//引入net模块
const net = require('net');
//创建TCP客户端
const client = new net.Socket();

创建一个socket对象的时候可以传入一个json对象。这个对象有以下属性:

fd:指定一个存在的文件描述符,默认值为null;
readable:是否允许在这个socket上读,默认值为false;
writeable:是否允许在这个socket上写,默认值为false;
allowHalfOpen:该属性为false时,TCP服务器接收到客户端发送的一个FIN包后,将会回发一个FIN包;该属性为true时,TCP服务器接收到客户端发送的一个FIN包后不会回发FIN包。

2.2、连接TCP服务器

创建了一个socket对象后,调用socket对象的connect()方法就可以连接一个TCP服务器,代码如下:

//引入net模块
const net = require('net');
//创建TCP客户端
const client = new net.Socket();
//设置连接的服务器
client.connect(8001, '127.0.0.1', function () {
    console.log("连接服务器成功");
});

连接成功如下图所示:

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

2.3、获取从TCP服务器发送的数据

socket对象有data、error、close、end等事件,因可以通过监听data事件来获取从TCP服务器发送的数据,代码如下:

//引入net模块
const net = require('net');
//创建TCP客户端
const client = new net.Socket();
//设置连接的服务器
client.connect(8001, '127.0.0.1', function () {
    console.log("连接服务器成功");
});
//监听data事件
client.on("data", function (data) {
    //打印数据
    console.log("接收到数据为:" + data.toString());
});

先启动TCP服务端,再运行上面客户端,可以发现命令行中已经输出了来自服务端的数据,说明此时已经实现了服务端和客户端之间的通信:

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

2.4、向TCP服务器发送数据

因为TCP客户端是一个socket对象,所以可以使用以下代码来向TCP服务器发送数据:

//引入net模块
const net = require('net');
//创建TCP客户端
const client = new net.Socket();
//设置连接的服务器
client.connect(8001, '127.0.0.1', function () {
    console.log("连接服务器成功");
    //给服务端发送数据
    client.write("Hello Server......");
});
//监听data事件
client.on("data", function (data) {
    //打印数据
    console.log("接收到数据为:" + data.toString());
});
//监听end事件
client.on("end", function () {
    console.log("客户端发送数据结束")
});

客户端控制台输出:

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

服务端控制台输出:

TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)

至此使用Node.js进行TCP网络通信完成,如有不对的地方欢迎指正。

原文地址:https://bbs.huaweicloud.com/blogs/300544?utm_source=juejin&utm_medium=bbs-ex&utm_campaign=other&utm_content=content

作者:lwq1228

更多编程相关知识,请访问:编程视频!!

위 내용은 TCP 네트워크 통신을 위해 Node.js를 사용하는 방법을 단계별로 가르칩니다(연습)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 华为云社区에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제