Кунал Релан, автор Alibaba Cloud Tech Share. Tech Share - это поощрительная программа Alibaba Cloud, направленная на поощрение обмена техническими знаниями и передовым опытом в облачном сообществе.

Начнем с основ. Одна из популярных сред выполнения JavaScript с открытым исходным кодом - Node.js, построенная на движке JavaScript V8 Chrome. Node.js в основном используется для создания серверных и сетевых приложений. TCP (протокол управления передачей) - это сетевой протокол, который обеспечивает надежную, упорядоченную и проверяемую на ошибки доставку потока данных между приложениями. Чтобы обе стороны могли обмениваться потоками данных, TCP-сервер должен принять запрос TCP-соединения, после чего соединение будет установлено.

Мы можем написать два типа программ TCP-сокетов - серверные и клиентские. Функция сервера - прослушивать соединения от клиента и затем отправлять обработанные данные обратно. Это общение происходит через сокеты.

Для программирования TCP в node.js требуется внутренний модуль с именем net, который работает как асинхронная оболочка для сетевого программирования. net - обширный модуль, тогда как в этом руководстве мы рассмотрим только TCP-сервер и клиент. Мы будем использовать Alibaba Cloud Elastic Compute Service (ECS) для создания сервера и клиента.

Начиная

Чтобы следовать этому руководству, вам понадобится машина, на которой запущен дистрибутив linux / unix, такой как ubuntu или macOS, установленный на нем редактор кода / IDE node.js и базовые рабочие знания node.js. В этом руководстве мы не будем развертывать приложение в производственной среде, а просто запустим его на нашей машине разработки и протестируем оттуда.

Создание TCP-сервера

Для начала создайте каталог, в котором вы хотите сохранить свое приложение. Для этого урока мы создадим наше приложение в ~/nodejs-tcp-app.

В этом руководстве мы будем выполнять большую часть нашей работы с терминалом, а также будем использовать nano редактор в терминале, чтобы процесс оставался одинаковым для всех платформ.

Для начала откройте свой терминал:

mkdir ~/nodejs-tcp-app

Теперь переключитесь во вновь созданный каталог и запустите npm init, чтобы создать файл package.json.

cd ~/nodejs-tcp-app && npm init

Теперь терминал запросит основную информацию о проекте, поэтому добавьте имя, автора и основной файл как server.js и создайте файл. Теперь вы должны увидеть файл package.json в каталоге.

Затем мы создадим файл server.js, в котором будет код для нашего TCP-сервера.

Теперь введите следующую команду в том же каталоге, который создаст server.jsfile и откроет текстовый редактор для написания кода.

nano server.js

Для начала мы импортируем модуль net, который входит в комплект поставки node.js, и определим порт и хост для запуска сервера, а затем создадим экземпляр сервера.

const net = require('net');
//define host and port to run the server
const port = 8080;
const host = '127.0.0.1';
//Create an instance of the server
const server = net.createServer();
//Start listening with the server on given port and host.
server.listen(port,host,function(){
   console.log(`Server started on ${host}:${port}`); 
});

Это основной строительный блок нашего приложения, которого должно хватить для запуска TCP-сервера.

Затем нам нужно добавить слушателя в соединение, к которому подключается клиент.

Отредактируйте объявление сервера, чтобы добавить функцию прослушивателя соединения с именем onClientConnection, а затем объявите функцию внизу.

const net = require('net');
//define host and port to run the server
const port = 8080;
const host = '127.0.0.1';
//Create an instance of the server
const server = net.createServer(onClientConnection);
//Start listening with the server on given port and host.
server.listen(port,host,function(){
   console.log(`Server started on port ${port} at ${host}`); 
});
//Declare connection listener function
function onClientConnection(sock){
    //Log when a client connnects.
    console.log(`${sock.remoteAddress}:${sock.remotePort} Connected`);
     //Listen for data from the connected client.
    sock.on('data',function(data){
        //Log data from the client
        console.log(`${sock.remoteAddress}:${sock.remotePort} Says : ${data} `);
        //Send back the data to the client.
        sock.write(`You Said ${data}`);
    });
    //Handle client connection termination.
    sock.on('close',function(){
        console.log(`${sock.remoteAddress}:${sock.remotePort} Terminated the connection`);
    });
    //Handle Client connection error.
    sock.on('error',function(error){
        console.error(`${sock.remoteAddress}:${sock.remotePort} Connection Error ${error}`);
    });
};

Итак, в функции onClientConnection мы ожидаем объект подключения sock, а затем создаем три прослушивателя событий, а именно data, close и error.

В прослушивателе событий data мы консоль регистрируем данные, полученные от клиента, и отправляем их обратно клиенту, а в прослушивателе событий close мы обрабатываем завершение соединения и журнал консоли одинаково. error прослушиватель событий обрабатывает ошибку подключения от клиента.

Это должно завершить наш server.js код, и теперь у нас есть работающее TCP-приложение, которое принимает TCP-клиентские соединения, прослушивает данные на них и отправляет их обратно клиенту. Теперь сохраните файл и выйдите из редактора nano.

Давайте создадим нашего TCP-клиента, используя тот же модуль.

Создание TCP-клиента

Давайте создадим наш client.js файл с помощью команды nano и начнем с ним работать.

nano client.js

Как и в случае с server.js, давайте импортируем сетевой модуль и определим аргументы конфигурации.

const net = require('net');
//define the server port and host
const port = 8080;
const host = '127.0.0.1';
//Create an instance of the socket client.
const client = new net.Socket();
//Connect to the server using the above defined config.
client.connect(port,host,function(){
   console.log(`Connected to server on ${host}:${port}`);
   //Connection was established, now send a message to the server.
   client.write('Hello from TCP client');
});
//Add a data event listener to handle data coming from the server
client.on('data',function(data){
   console.log(`Server Says : ${data}`); 
});
//Add Client Close function
client.on('close',function(){
   console.log('Connection Closed');
});
//Add Error Event Listener
client.on('error',function(error){
   console.error(`Connection Error ${error}`); 
});

Так что это должно быть для нашего client.js, который будет подключаться к серверу, отправлять сообщение при подключении и регистрировать ответ с сервера.

Здесь мы снова добавили три прослушивателя событий, точно так же, как сервер, для обработки данных, прерывания соединения и ошибок соединения.

Теперь сохраните файл и выйдите из редактора nano.

Тестирование соединения

Когда мы закончили создание нашего сервера и клиентского приложения на основе TCP, теперь нам нужно запустить наш сервер и соединить TCP-клиент с сервером.

Для этого нам понадобятся два терминальных сеанса - один для сервера, а другой - для клиента.

В первом мы запустим сервер с помощью следующей команды:

node server.js

Эта команда должна запустить TCP-сервер, и в терминале вы должны увидеть журнал:

Server started on 127.0.0.1:8080

Затем нам нужно запустить наш клиентский файл TCP, чтобы подключиться к серверу и отправить сообщение. В другом терминале введите следующую команду:

node client.js

Это должно породить наш TCP-клиент, который затем попытается подключиться к серверу и отправить сообщение. Теперь на вашем терминале вы должны увидеть следующий текст.

Connected to server on 127.0.0.1:8080
Server Says : You Said Hello from TCP client

Итак, теперь мы знаем, что клиент смог подключиться к серверу и получил ответное эхо, которое мы смогли зарегистрировать.

Затем, когда вы вернетесь к сеансу терминала, на котором запущен сервер, вы должны это увидеть. Однако порт клиента может отличаться:

127.0.0.1:56330 Connected
127.0.0.1:56330 Says : Hello from TCP client

Мы не закрываем клиентское соединение программно, поэтому прослушиватель событий close не сработает. Однако, если вы вернетесь в клиентский терминал и нажмете ^c, клиент будет завершен, и в серверном терминале вы должны будете получить журнал разрыва соединения.

127.0.0.1:56330 Terminated the connection

Мы успешно протестировали наш TCP-сервер и клиент.

Вывод

В этом руководстве вы создали приложение TCP с помощью Node.js в экземплярах Alibaba Cloud Elastic Compute Service (ECS). Мы можем сделать намного больше с TCP Sockets, и это была вводная программа. Расширенной версией этого может быть чат, позволяющий людям отправлять и получать сообщения через TCP-сервер. Вы также можете использовать его для обработки больших блоков потоков данных для передачи данных в реальном времени.

Ссылка: https://www.alibabacloud.com/blog/node-js-tcp-app-development-on-ecs_594176?spm=a2c41.12293551.0.0