1. Вступительный анализ
Начиная с сегодняшнего дня, давайте подробно изучим в определенных модулях. Эта статья является третьей статьей в этой серии. Первые две статьи в основном основаны на теории. Я считаю, что при изучении первых двух статей,
У меня также есть базовое понимание Nodejs, все в порядке! ! ! Удар, пока железо жарко, давайте продолжим носить узлы до конца. Что ж, не говоря по большой чепухе, перейдите прямо к сегодняшней теме «сетевой модуль». Так как же «сеть» должен это понять?
Для чего это? ( Net модуль можно использовать для создания серверов сокетов или клиентов сокетов. Два самых основных модуля для Nodejs Data Communication являются чистые и http. Первое представляет собой инкапсуляцию на основе TCP, в то время как последнее, по сути, является слоем TCP, но он сделал много инкапсуляции данных, которые мы рассматриваем в качестве презентационного слоя).
Здесь мы ссылаемся на исходный код в Nodejs "http.js":
Из рисунка не сложно увидеть, что Httpserver наследует чистый класс, обладает связанными возможностями связи и выполняет больше инкапсуляции данных, которые мы считаем более продвинутым уровнем представления.
Расширенные знания (следующее приведено исходный код "наследства"):
Кода -копия выглядит следующим образом:
exports.inherits = function (ctor, superctor) {
ctor.super_ = superctor;
ctor.prototype = object.create (superctor.prototype, {
конструктор: {
значение: ctor,
перечисляется: ложь,
Записывается: правда,
настраивается: true
}
});
};
Функция состоит в том, чтобы реализовать наследование и повторное использование.
Я только что дал краткий обзор, который содержит некоторые широко используемые понятия. Вот краткое введение в популяризирующие концепции:
(1) Протокол TCP/IP ---------- TPC/IP является протоколом транспортного уровня, который в основном решает, как данные передаются в сети.
(2), сокет ----- сокет-это инкапсуляция и применение протокола TCP/IP (уровень программы).
(3), http ------ http является протоколом приложений, который в основном решает, как обернуть данные.
(4) Модель с семислойной сетью ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Подводя итог: сокет является инкапсуляцией протокола TCP/IP. Сама сокет является не протоколом, а вызывающим интерфейс (API).
Это формирует некоторые из самых основных функциональных интерфейсов, которые мы знаем, такие как создание, прослушивание, подключение, принятие, отправка, чтение и написание и т. Д.
TCP/IP - это просто стек протоколов, точно так же, как операционный механизм операционной системы, он должен быть подробно реализован, а также предоставляет внешние операционные интерфейсы.
Фактически, TCP транспортного уровня основан на протоколе IP сетевого уровня, а протокол HTTP уровня приложения основан на протоколе TCP транспортного уровня. Сама сокет не является протоколом. Как упомянуто выше, он предоставляет только интерфейс для программирования TCP или UDP.
Во -вторых, испытайте это
Хорошо, у нас есть концепция, давайте возьмем пример:
1. Создать Server.js
Кода -копия выглядит следующим образом:
var net = require ('net');
var server = net.createserver (function (c) {// Прослушитель подключения
console.log ("Сервер подключен");
c.on ("end", function () {
console.log («Сервер был отключен»);
});
C.Write ("Привет, BigBear!/R/N");
C.pipe (C);
});
server.listen (8124, function () {// прослушивание прослушивания
console.log ("Серверный связанный");
});
2. Создать client.js
Кода -копия выглядит следующим образом:
var net = require ('net');
var client = net.connect ({
Порт: 8124
}, function () {// подключить прослушиватель
console.log ("Client подключен");
client.write ('Привет, детка!/r/n');
});
client.on ("data", function (data) {
console.log (data.toString ());
client.end ();
});
client.on ("end", function () {
console.log ("Client отключить");
});
Давайте проанализируем:
Сервер ------ net.createServer создает службу TCP. Эта служба связана (server.listen) в порту 8124. После создания сервера мы видим функцию обратного вызова.
При вызове вышеуказанной функции параметр также является функцией, и он принимает сокет, трубу, построенную другими методами, и его функция предназначена для взаимодействия данных.
Клиент должен встретить трубку, чтобы установить его. Если в данный момент нет клиентского доступа к серверу, этого сокета не будет.
Как следует из названия,客户端------net.connect подключен к серверу. Первый параметр - это объект. Порт (порт) установлен на 8124, который является портом, который слушает наш сервер. Поскольку параметр хоста не установлен, по умолчанию по умолчанию является локальный (локальный).
На сервере розетка является одним концом трубопровода, а в клиенте сам клиент - один конец трубопровода. Если несколько клиентов подключены к серверу, сервер будет создавать несколько сокетов, и каждый сокет соответствует клиенту.
Результаты работы:
3. Дело введение
(1) Следующий код-это просто сервер, который выводит кусок текста клиенту, чтобы завершить одностороннее общение с сервера к клиенту.
Кода -копия выглядит следующим образом:
// sear-> одностороннее общение клиента
var net = require ('net');
var Chatserver = net.createserver ();
Chatserver.on ('connection', function (client) {
client.write ('hi!/n'); // сервер выводит информацию клиенту и использует метод write ()
client.write ('bye!/n');
client.end (); // Сервер заканчивает сеанс
});
Chatserver.listen (9000);
Тест Telnet: Telnet127.0.0.1: 9000
После выполнения Telnet подключитесь к точке службы, обратите внимание на символы HI! Пока!, И немедленно прекратите программу сервера и прекратите соединение.
Что если мы хотим, чтобы сервер подключился к информации к клиенту?
Вы можете прослушать событие Server.data и не прервать соединение (или оно немедленно завершит сообщения от клиента, которые не могут быть приняты).
(2), прослушайте событие Server.data и не прерывайте соединение (в противном случае сообщения от клиента не смогут быть приняты немедленно).
Кода -копия выглядит следующим образом:
// На основании первого, реализовать клиент-> Sever Communication, которая является двусторонней общением
var net = require ('net');
var Chatserver = net.createserver (),
clientlist = [];
Chatserver.on ('connection', function (client) {
// JS может свободно добавлять свойства к объектам. Здесь мы добавляем пользовательский атрибут имени, чтобы указать, какой клиент (адрес + порт клиента основан на)
client.name = client.remoteaddress + ':' + client.remoteport;
client.write ('hi' + client.name + '!/n');
clientlist.push (клиент);
client.on ('data', function (data) {
вещание (данные, клиент); // Принять информацию от клиента
});
});
Функция вещания (сообщение, клиент) {
for (var i = 0; i <clientlist.length; i+= 1) {
if (client! == clientlist [i]) {
clientlist [i] .write (client.name + »говорит« + сообщение);
}
}
}
Chatserver.listen (9000);
Вышеуказанный полный код? Мы сказали, что есть еще одна проблема, которая не была принята во внимание: то есть, как только клиент выходит, она остается в клиентском списке, что, очевидно, является нулевым указателем.
(3) Процесс клиентский список
Кода -копия выглядит следующим образом:
Chatserver.on ('connection', function (client) {
client.name = client.remoteaddress + ':' + client.remoteport
client.write ('hi' + client.name + '!/n');
clientlist.push (клиент)
client.on ('data', function (data) {
трансляция (данные, клиент)
})
client.on ('end', function () {
clientlist.splice (clientlist.indexof (client), 1); // Удалить элемент формулы в массиве.
})
})
Nodetcpapi предоставил нам конечное событие, то есть, когда клиент прерывает соединение с сервером.
(4) Оптимизировать трансляцию
Кода -копия выглядит следующим образом:
Функция вещания (сообщение, клиент) {
var cleanup = []
for (var i = 0; i <clientlist.length; i+= 1) {
if (client! == clientlist [i]) {
if (clientlist [i] .writable) {// Проверьте, первыми ли
ClientList [i] .write (client.name + »говорит« + сообщение)
} еще {
learup.push (clientlist [i]) // Если он не подлежит записи, собирайте и уничтожайте его. Перед разрушением, Socket.destroy () должен быть уничтожен API.
clientlist [i] .destroy ()
}
}
} // Удалить мертвые узлы из петли записи, чтобы избежать индекса цикла разрыва
for (i = 0; i <cleanup.length; i+= 1) {
clientlist.splice (clientlist.indexof (очистка [i]), 1)
}
}
Обратите внимание, что после того, как «конец» не будет запускается, произойдет исключение, поэтому будет выполнена работа оптимизации.
(5) NetApi также предоставляет событие ошибки, чтобы завоевать исключения клиента
Кода -копия выглядит следующим образом:
client.on ('error', function (e) {
console.log (e);
});
Четыре, давайте обобфрим
1. Понять соответствующие концепции начала
2. Понять взаимосвязь между HTTP и чистыми модулями
3. На основании примеров в этой статье, пожалуйста, обратитесь к соответствующим API для практики.
4. Идеи связи между клиентом сокета и сервером
5. Если вам интересно, вы можете улучшить пример этой чата