Кунал Релан, автор 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.js
file и откроет текстовый редактор для написания кода.
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